.NET6的PeriodicTimer如何改写为支持长尾词的定时器类,实现周期性任务调度?

2026-03-30 10:501阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计705个文字,预计阅读时间需要3分钟。

.NET6的PeriodicTimer如何改写为支持长尾词的定时器类,实现周期性任务调度?

目录+前言+一、Demo+结论:+前言:+在.NET中,已存在以下5种Timer类:+System.Threading.Timer+System.Timers.Timer+System.Web.UI.Timer+System.Windows.Forms.Timer+System.Windows.Threading.DispatcherTimer+不管以前这样设计过+二、结论:+在.NET中,存在多种Timer类,可供开发者根据不同需求选择使用。

目录
  • 前言:
  • 一、Demo
  • 结论:

前言:

在.NET中,已经存在了5个Timer类:

System.Threading.Timer System.Timers.Timer System.Web.UI.Timer System.Windows.Forms.Timer System.Windows.Threading.DispatcherTimer

不管以前这样设计的原因,现在.NET 6又为我们增加了一个新Timer,​​PeriodicTimer​​。

这又是为什么呢?

一、Demo

与其他Timer需要创建事件回调不同:

Timer timer = new Timer(delegate {     Thread.Sleep(3000);     Console.WriteLine($"Timer Thread: {Thread.CurrentThread.ManagedThreadId}");     Console.WriteLine($"{DateTime.Now.Second} Timer tick"); },null,0,1000 );

PeriodicTimer的使用方式如下:

//间隔时间1秒 using (var timer = new PeriodicTimer(TimeSpan.FromSeconds(1))) {     //在到达指定周期后执行方法     while (await timer.WaitForNextTickAsync())     {         await Task.Delay(3000);           Console.WriteLine($"Timer Thread: {Thread.CurrentThread.ManagedThreadId}");         Console.WriteLine($"{DateTime.Now.Second} PeriodicTimer tick");     } }

​从​​await​​关键字可以看出,PeriodicTimer用于异步执行;并且一次只有一个线程可以执行。

另外,你可以控制​停止PeriodicTimer计时​。示例代码如下:

//创建CancellationTokenSource,指定在3秒后将被取消 var cts = new CancellationTokenSource(TimeSpan.FromSeconds(3)); using (var timer = new PeriodicTimer(TimeSpan.FromSeconds(1))) {     while (await timer.WaitForNextTickAsync(cts.Token))     {         Console.WriteLine($"{DateTime.Now.Second} PeriodicTimer tick");     } }

需要注意的是,这会引发​​OperationCancelled​​异常,你需要捕获该异常,然后根据需要进行处理:

当然,你也可以通过主动取消CancellationTokenSource,来停止PeriodicTimer计时,

示例代码如下:

var cts = new CancellationTokenSource(); using (var timer = new PeriodicTimer(TimeSpan.FromSeconds(1))) {     int count = 0;     while (await timer.WaitForNextTickAsync(cts.Token))     {         if (++count == 3)         {             //执行3次后取消             cts.Cancel();         }         Console.WriteLine($"{DateTime.Now.Second} PeriodicTimer tick");     } }

这次换成了​​TaskCancelled​​异常:

如果,你不想抛出异常,则可以用PeriodicTimer.Dispose方法来停止计时,

示例代码如下:

using (var timer = new PeriodicTimer(TimeSpan.FromSeconds(1))) {     int count = 0;     while (await timer.WaitForNextTickAsync())     {         if (++count == 3)         {             //执行3次后取消             timer.Dispose();         }         Console.WriteLine($"{DateTime.Now.Second} PeriodicTimer tick");     } }

结论:

通过上面的代码,可以了解到,设计PeriodicTimer的原因,可以归结为:

  • 用于异步上下文
  • 一次仅由一个消费者使用​

到此这篇关于.NET 6新特性试用Timer类之PeriodicTimer 的文章就介绍到这了,更多相关Timer类之PeriodicTimer 内容请搜索自由互联以前的文章或继续浏览下面的相关文章希望大家以后多多支持自由互联!

.NET6的PeriodicTimer如何改写为支持长尾词的定时器类,实现周期性任务调度?

本文共计705个文字,预计阅读时间需要3分钟。

.NET6的PeriodicTimer如何改写为支持长尾词的定时器类,实现周期性任务调度?

目录+前言+一、Demo+结论:+前言:+在.NET中,已存在以下5种Timer类:+System.Threading.Timer+System.Timers.Timer+System.Web.UI.Timer+System.Windows.Forms.Timer+System.Windows.Threading.DispatcherTimer+不管以前这样设计过+二、结论:+在.NET中,存在多种Timer类,可供开发者根据不同需求选择使用。

目录
  • 前言:
  • 一、Demo
  • 结论:

前言:

在.NET中,已经存在了5个Timer类:

System.Threading.Timer System.Timers.Timer System.Web.UI.Timer System.Windows.Forms.Timer System.Windows.Threading.DispatcherTimer

不管以前这样设计的原因,现在.NET 6又为我们增加了一个新Timer,​​PeriodicTimer​​。

这又是为什么呢?

一、Demo

与其他Timer需要创建事件回调不同:

Timer timer = new Timer(delegate {     Thread.Sleep(3000);     Console.WriteLine($"Timer Thread: {Thread.CurrentThread.ManagedThreadId}");     Console.WriteLine($"{DateTime.Now.Second} Timer tick"); },null,0,1000 );

PeriodicTimer的使用方式如下:

//间隔时间1秒 using (var timer = new PeriodicTimer(TimeSpan.FromSeconds(1))) {     //在到达指定周期后执行方法     while (await timer.WaitForNextTickAsync())     {         await Task.Delay(3000);           Console.WriteLine($"Timer Thread: {Thread.CurrentThread.ManagedThreadId}");         Console.WriteLine($"{DateTime.Now.Second} PeriodicTimer tick");     } }

​从​​await​​关键字可以看出,PeriodicTimer用于异步执行;并且一次只有一个线程可以执行。

另外,你可以控制​停止PeriodicTimer计时​。示例代码如下:

//创建CancellationTokenSource,指定在3秒后将被取消 var cts = new CancellationTokenSource(TimeSpan.FromSeconds(3)); using (var timer = new PeriodicTimer(TimeSpan.FromSeconds(1))) {     while (await timer.WaitForNextTickAsync(cts.Token))     {         Console.WriteLine($"{DateTime.Now.Second} PeriodicTimer tick");     } }

需要注意的是,这会引发​​OperationCancelled​​异常,你需要捕获该异常,然后根据需要进行处理:

当然,你也可以通过主动取消CancellationTokenSource,来停止PeriodicTimer计时,

示例代码如下:

var cts = new CancellationTokenSource(); using (var timer = new PeriodicTimer(TimeSpan.FromSeconds(1))) {     int count = 0;     while (await timer.WaitForNextTickAsync(cts.Token))     {         if (++count == 3)         {             //执行3次后取消             cts.Cancel();         }         Console.WriteLine($"{DateTime.Now.Second} PeriodicTimer tick");     } }

这次换成了​​TaskCancelled​​异常:

如果,你不想抛出异常,则可以用PeriodicTimer.Dispose方法来停止计时,

示例代码如下:

using (var timer = new PeriodicTimer(TimeSpan.FromSeconds(1))) {     int count = 0;     while (await timer.WaitForNextTickAsync())     {         if (++count == 3)         {             //执行3次后取消             timer.Dispose();         }         Console.WriteLine($"{DateTime.Now.Second} PeriodicTimer tick");     } }

结论:

通过上面的代码,可以了解到,设计PeriodicTimer的原因,可以归结为:

  • 用于异步上下文
  • 一次仅由一个消费者使用​

到此这篇关于.NET 6新特性试用Timer类之PeriodicTimer 的文章就介绍到这了,更多相关Timer类之PeriodicTimer 内容请搜索自由互联以前的文章或继续浏览下面的相关文章希望大家以后多多支持自由互联!

.NET6的PeriodicTimer如何改写为支持长尾词的定时器类,实现周期性任务调度?