76.读取计时器运行时间 C#例子 WPF例子

news2025/3/5 23:44:03

TimerManager:一个增强的定时器类,带时间管理功能

在使用定时器时,我们常常需要知道定时器的运行状态,比如它已经运行了多久,或者还剩下多少时间。然而,.NET 的 System.Timers.Timer 类本身并没有直接提供这些信息。为了满足这些需求,我们扩展了 System.Timers.Timer,创建了一个新的类——TimerManager,它不仅继承了原生定时器的所有功能,还新增了开始时间、已启动时间和剩余时间的属性。接下来,我们将详细介绍这些新增功能及其使用方法。

一、新增功能介绍

1. 开始时间(startTime

startTime 是一个 DateTime 类型的字段,用于记录定时器开始运行的时间点。在 TimerManager 的构造函数中,我们通过 DateTime.Now 获取当前时间,并将其赋值给 startTime。这样,我们就能准确地知道定时器是从何时开始计时的。

2. 已启动时间(ElapsedTime

ElapsedTime 是一个 TimeSpan 类型的属性,用于表示定时器从开始运行到当前时间的总时长。它的计算方式非常简单,就是通过 DateTime.Now - startTime 得到一个时间差,这个时间差就是定时器的已运行时间。TimeSpan 是一个非常合适的类型来表示时间间隔,它提供了丰富的属性和方法,方便我们对时间进行进一步的操作和格式化。

3. 剩余时间(TimeRemaining

TimeRemaining 同样是一个 TimeSpan 类型的属性,它表示定时器从当前时间到下次触发事件之间剩余的时间。它的计算基于定时器的时间间隔(interval)和已运行时间(ElapsedTime)。具体来说,我们通过 interval - ElapsedTime.TotalMilliseconds 计算出剩余时间的毫秒数,然后使用 TimeSpan.FromMilliseconds 方法将其转换为 TimeSpan 类型。

二、使用方法

接下来,我们将通过一个简单的示例来展示如何使用 TimerManager 类及其新增的时间管理功能。

示例代码

using System;
using System.Timers;

class Program
{
    static void Main(string[] args)
    {
        // 创建一个 TimerManager 实例,设置时间间隔为 5 秒(5000 毫秒)
        TimerManager timer = new TimerManager(5000);

        // 订阅 Elapsed 事件,当定时器触发时执行任务
        timer.Elapsed += (sender, e) =>
        {
            Console.WriteLine("定时器触发,任务执行!");
            Console.WriteLine($"已启动时间:{timer.ElapsedTime}");
            Console.WriteLine($"剩余时间:{timer.TimeRemaining}");
        };

        // 每隔一段时间打印当前的已启动时间和剩余时间
        System.Timers.Timer printTimer = new System.Timers.Timer(1000); // 每秒打印一次
        printTimer.Elapsed += (sender, e) =>
        {
            Console.WriteLine($"已启动时间:{timer.ElapsedTime}");
            Console.WriteLine($"剩余时间:{timer.TimeRemaining}");
        };
        printTimer.Start();

        // 等待定时器触发
        Console.WriteLine("定时器已启动,等待触发...");
        Console.ReadLine();
    }
}
 //定时器管理类
 public class TimerManager : System.Timers.Timer
 {
     public System.DateTime startTime;//开始时间 
     public double interval;    //计时器时间

     //构造函数,传入计时器的时间
     public TimerManager(double interval) : base(interval)
     {
         startTime= System.DateTime.Now;
         this.interval = interval;
         this.AutoReset = false;//设置为false,即只执行一次
         this.Enabled = true;//设置为true,即马上执行
     }
     // 已启动的时间(单位:毫秒)
     public TimeSpan ElapsedTime
     {
         get
         {
             return DateTime.Now - startTime;
         }
     }

     // 剩余时间(返回类型为 TimeSpan)
     public TimeSpan TimeRemaining
     {
         get
         {
             return TimeSpan.FromMilliseconds(interval - ElapsedTime.TotalMilliseconds);
         }
     }
 }

示例输出

假设定时器的时间间隔为 5 秒,程序运行后每秒打印一次:

定时器已启动,等待触发...
已启动时间:00:00:01
剩余时间:00:00:04
已启动时间:00:00:02
剩余时间:00:00:03
已启动时间:00:00:03
剩余时间:00:00:02
已启动时间:00:00:04
剩余时间:00:00:01
定时器触发,任务执行!
已启动时间:00:00:05
剩余时间:00:00:00

三、总结

通过在 TimerManager 类中新增开始时间、已启动时间和剩余时间的属性,我们能够更直观地了解定时器的运行状态。这些属性的实现基于 DateTimeTimeSpan 类型,提供了强大的时间和时间间隔处理功能。在实际开发中,这些功能可以帮助我们更好地监控和管理定时任务,例如在倒计时应用中实时显示剩余时间,或者在日志中记录任务的执行时长。

希望这篇文章能够帮助你更好地理解和使用 TimerManager 类。如果你有任何问题或建议,欢迎在评论区留言讨论!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2310248.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

React封装通用Table组件,支持搜索(多条件)、筛选、自动序号、数据量统计等功能。未采用二次封装调整灵活,包含使用文档

封装通用组件 一、封装思想二、react代码三、css代码四、实现效果五、使用文档 BasicTableModal 表格模态框组件1.组件简介2.功能特点3.使用方法基础用法宽度控制示例带筛选功能搜索功能示例自定义单元格渲染 4.API 说明PropsColumn 配置项Filter 配置项 5.注意事项 一、封装思…

【JavaEE】-- 多线程(初阶)4

文章目录 8.多线程案例8.1 单例模式8.1.1 饿汉模式8.1.2 懒汉模式 8.2 阻塞队列8.2.1 什么是阻塞队列8.2.2 生产者消费者模型8.2.3 标准库中的阻塞队列8.2.4 阻塞队列的应用场景8.2.4.1 消息队列 8.2.5 异步操作8.2.5 自定义实现阻塞队列8.2.6 阻塞队列--生产者消费者模型 8.3 …

WP 高级摘要插件:助力 WordPress 文章摘要精准自定义显示

wordpress插件介绍 “WP高级摘要插件”功能丰富,它允许用户在WordPress后台自定义文章摘要。 可设置摘要长度,灵活调整展示字数;设定摘要最后的显示字符, 如常用的省略号等以提示内容未完整展示;指定允许在摘要中显示…

论文阅读 EEG-Inception

EEG-Inception: A Novel Deep Convolutional Neural Network for Assistive ERP-Based Brain-Computer Interfaces EEG-Inception是第一个集成Inception模块进行ERP检测的模型,它有效地结合了轻型架构中的其他结构,提高了我们方法的性能。 本研究的主要目…

FFmpeg入门:最简单的音频播放器

FFmpeg入门:最简单的音频播放器 欢迎大家来到FFmpeg入门的第二章,今天只做一个最简单的FFmpeg音频播放器;同样,话不多说,先上流程图 流程图 以上流程和视频播放器的解码过程基本上是一致的; 不同点在于 S…

基于Linux系统的物联网智能终端

背景 产品研发和项目研发有什么区别?一个令人发指的问题,刚开始工作时项目开发居多,认为项目开发和产品开发区别不大,待后来随着自身能力的提升,逐步感到要开发一个好产品还是比较难的,我认为项目开发的目的…

Netty笔记9:粘包半包

Netty笔记1:线程模型 Netty笔记2:零拷贝 Netty笔记3:NIO编程 Netty笔记4:Epoll Netty笔记5:Netty开发实例 Netty笔记6:Netty组件 Netty笔记7:ChannelPromise通知处理 Netty笔记8&#xf…

LabVIEW虚拟弗兰克赫兹实验仪

随着信息技术的飞速发展,虚拟仿真技术已经成为教学和研究中不可或缺的工具。开发了一种基于LabVIEW平台开发的虚拟弗兰克赫兹实验仪,该系统不仅能模拟实验操作,还能实时绘制数据图形,极大地丰富了物理实验的教学内容和方式。 ​ …

spring boot + vue 搭建环境

参考文档:https://blog.csdn.net/weixin_44215249/article/details/117376417?fromshareblogdetail&sharetypeblogdetail&sharerId117376417&sharereferPC&sharesourceqxpapt&sharefromfrom_link. spring boot vue 搭建环境 一、浏览器二、jd…

清华团队提出HistoCell,从组织学图像推断超分辨率细胞空间分布助力癌症研究|顶刊精析·25-03-02

小罗碎碎念 今天和大家分享一篇2025-02-21发表于nature communications的文章,内容涉及病理空转单细胞。 从组织学图像推断细胞空间分布对癌症研究意义重大,但现有方法存在标注工作量大、分辨率或特征挖掘不足等局限。研究旨在开发一种高效准确的方法。 …

html+js 轮播图

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>轮播图示例</title><style>/* 基本样式…

vue3:初学 vue-router 路由配置

承上一篇&#xff1a;nodejs&#xff1a;express js-mdict 作为后端&#xff0c;vue 3 vite 作为前端&#xff0c;在线查询英汉词典 安装 cnpm install vue-router -S 现在讲一讲 vue3&#xff1a;vue-router 路由配置 cd \js\mydict-web\src mkdir router cd router 我还…

Python 爬取唐诗宋词三百首

你可以使用 requests 和 BeautifulSoup 来爬取《唐诗三百首》和《宋词三百首》的数据。以下是一个基本的 Python 爬虫示例&#xff0c;它从 中华诗词网 或类似的网站获取数据并保存为 JSON 文件。 import requests from bs4 import BeautifulSoup import json import time# 爬取…

C语言408考研先行课第一课:数据类型

由于408要考数据结构……会有算法题…… 所以&#xff0c;需要C语言来进行一个预备…… 因为大一贪玩&#xff0c;C语言根本没学进去……谁能想到考研还用得到呢&#xff1f;【手动doge&#xff08;bushi&#xff09; 软件用的是Clion&#xff0c;可以自行搜索教程下载使用。…

03 HarmonyOS Next仪表盘案例详解(二):进阶篇

温馨提示&#xff1a;本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦&#xff01; 文章目录 前言1. 响应式设计1.1 屏幕适配1.2 弹性布局 2. 数据展示与交互2.1 数据卡片渲染2.2 图表区域 3. 事件处理机制3.1 点击事件处理3.2 手势…

探秘基带算法:从原理到5G时代的通信变革【四】Polar 编解码(一)

文章目录 2.3 Polar 编解码2.3.1 Polar 码简介与发展背景2.3.2 信道极化理论基础对称容量与巴氏参数对称容量 I ( W ) I(W) I(W)巴氏参数 Z ( W ) Z(W) Z(W)常见信道信道联合信道分裂信道极化 本博客为系列博客&#xff0c;主要讲解各基带算法的原理与应用&#xff0c;包括&…

基础篇(一)强化学习是什么?从零开始理解智能体的学习过程

强化学习是什么&#xff1f;从零开始理解智能体的学习过程 你是否曾好奇过&#xff0c;人工智能是如何在复杂的环境中学会做出决策的&#xff1f;无论是打游戏的AI&#xff0c;还是自动驾驶的汽车&#xff0c;还是最近很火的DeepSeek它们的背后都离不开一种强大的技术——强化…

如何直接导出某个conda环境中的包, 然后直接用 pip install -r requirements.txt 在新环境中安装

1. 导出 Conda 环境配置 conda list --export > conda_requirements.txt这将生成一个 conda_requirements.txt 文件&#xff0c;其中包含当前环境中所有包的列表及其版本信息。 2. 转换为 requirements.txt 文件 grep -v "^#" conda_requirements.txt | cut -d …

基于 HTML、CSS 和 JavaScript 的智能九宫格图片分割系统

目录 1 前言 2 技术实现 2.1 HTML 结构 2.2 CSS 样式 2.3 JavaScript 交互 3 代码解析 3.1 HTML 部分 3.2 CSS 部分 3.3 JavaScript 部分 4 完整代码 5 运行结果 6 总结 6.1 系统特点 6.2 使用方法 1 前言 在当今数字化的时代&#xff0c;图片处理需求日益增长。…

委托者模式(掌握设计模式的核心之一)

目录 问题&#xff1a; 举例&#xff1a; 总结&#xff1a;核心就是利用Java中的多态来完成注入。 问题&#xff1a; 今天刷面经&#xff0c;刷到装饰者模式&#xff0c;又进阶的发现委托者模式&#xff0c;发现还是不理解&#xff0c;特此记录。 举例&#xff1a; ​老板​…