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
类中新增开始时间、已启动时间和剩余时间的属性,我们能够更直观地了解定时器的运行状态。这些属性的实现基于 DateTime
和 TimeSpan
类型,提供了强大的时间和时间间隔处理功能。在实际开发中,这些功能可以帮助我们更好地监控和管理定时任务,例如在倒计时应用中实时显示剩余时间,或者在日志中记录任务的执行时长。
希望这篇文章能够帮助你更好地理解和使用 TimerManager
类。如果你有任何问题或建议,欢迎在评论区留言讨论!