.NET Framework中定时器timer的单线程与多线程使用讲解
什么是定时器timer
在 .NET Framework中,Timer 是一种计时器,用于定期执行一些操作。可以使用 Timer 指定在多长时间后执行一个操作。可用作定期检查磁盘驱动器、定期下载网页或文件,或定期脚本。Timer 可在 Windows.Forms、ASP.NET、WPF 或 Windows 服务应用程序中使用。
Timer的单线程使用
在单线程情况下,Timer比较容易使用,只需要创建一个计时器并设定时间,绑定定时器的事件即可。下面我们给出代码示例
using System;
using System.Timers;
public class InprocessTimerExample
{
public static void Main()
{
Timer timer = new Timer(1000); // 创建计时器,1000毫秒后执行一次
timer.Elapsed += OnTimedEvent; // 绑定事件
timer.AutoReset = true; // 自动重置
timer.Enabled = true; // 启用计时器
Console.WriteLine("请按任意键结束...");
Console.ReadLine();
}
private static void OnTimedEvent(Object source, ElapsedEventArgs e)
{
Console.WriteLine("计时器经过了{0}毫秒", e.SignalTime.Millisecond);
}
}
在上述示例中,创建了一个计时器,并设定时间为1000毫秒。然后通过绑定 Elapsed
事件,实现了在每隔一个1s的时间,输出当前毫秒数的效果。
Timer的多线程使用
在多线程环境下,Timer的使用方式稍微有些不同,我们需要考虑多线程环境下的线程安全问题。在多线程环境下,比较常见的一种做法是使用 System.Threading.Timer
。使用方式与单线程略有不同,需要通过传递参数到定时器的方法中,并通过回调函数获取返回值。我们给出一个示例:
using System;
using System.Threading;
using System.Threading.Tasks;
public class MultithradingTimerExample
{
static CancellationTokenSource cts = new CancellationTokenSource();
static ManualResetEventSlim completedEvent = new ManualResetEventSlim(false);
public static void Main()
{
Task queryTask = Task.Factory.StartNew(() =>
{
using (Timer timer = new Timer(new TimerCallback(MyMethod), cts.Token, TimeSpan.Zero, TimeSpan.FromSeconds(2)))
{
Console.WriteLine("等待计时器事件处理中...");
completedEvent.Wait(cts.Token);
}
Console.WriteLine("已完成计时器定时任务!");
}, cts.Token);
Console.WriteLine("按下任意按键结束计时器任务");
Console.ReadKey();
cts.Cancel();
completedEvent.Set();
queryTask.Wait(cts.Token);
}
static void MyMethod(object state)
{
CancellationToken token = (CancellationToken)state;
if (token.IsCancellationRequested)
{
Console.WriteLine("执行取消操作!");
completedEvent.Set();
}
else
{
Console.WriteLine("计时器方法执行中...");
}
}
}
上述示例定义了一个 MultithradingTimerExample
类并使用了 System.Threading.Timer
。在启动任务时,我们需要创建一个可以终止任务的 CancellationTokenSource
,并将该 CancellationTokenSource.Token
作为计时器的回调函数的输入参数。使用 ManualResetEventSlim
以确保正确地回收事件处理线程,同时还保证顺序执行任务。
我们可以在 MyMethod()
方法中处理定时事件,并通过 CancellationToken.IsCancellationRequested
属性检查是否需要取消操作。一旦取消操作被请求,我们就可以通过调用 completedEvent.Set()
方法来释放等待事件处理程序的线程。
最后输出的结果为:
等待计时器事件处理中...
计时器方法执行中...
计时器方法执行中...
计时器方法执行中...
计时器方法执行中...
按下任意按键结束计时器任务
执行取消操作!
已完成计时器定时任务!
从中我们可以看到,即使在多线程情况下,定时器也可以正常运行。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:.NET Framework中定时器timer的单线程与多线程使用讲解 - Python技术站