前言

在.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的原因,可以归结为:

  • 用于异步上下文

  • 一次仅由一个消费者使用

    如果你觉得这篇文章对你有所启发,请关注我的个人公众号”My IO“

.NET 6新特性试用 | PeriodicTimer相关推荐

  1. .NET 6新特性试用 | 总结:我最喜欢的5个特性

    前言 不知不觉,<.NET 6新特性试用>系列文章已经写了20多篇,而今天终于要告一段落了. 如果你还没有看过,详细文章列表在这里: .NET 6新特性试用系列 在这么多特性中,我最喜欢如 ...

  2. .NET 6新特性试用 | 可空引用类型

    前言 在查看<隐式using指令>功能时,我们在csproj中发现这样一个属性: 那么,Nullable到底是干嘛的? 可为空上下文 严格来说,这不是新特性,而是C# 8.0引入的特性之一 ...

  3. 5.0 新特性试用体验之 Clustered Index

    作者:hzc989 原文来源: https://tidb.net/blog/69dd056c [是否原创]是 [首发渠道]TiDB 社区 [目录] 一.引言 二.基础前情回顾 三.era withou ...

  4. .NET 6新特性试用 | 可写JSON DOM API

    前言 我们常用JSON的方式,是将类对象序列化/反序列化: var user = new User { Name = "My IO" }; var json = JsonSeria ...

  5. .NET 6新特性试用 | SDK工作负载

    前言 为了应对.NET SDK能够支持的程序集项目(例如iOS.Android.WASM)的不断增长,从.NET 6开始,允许用户仅安装必要的SDK(例如ASP.NET Core),而不是一次性安装& ...

  6. .NET 6新特性试用 | LINQ功能改进

    前言 .NET6为LINQ添加了多个新API,在本文中,我们将始终使用User类逐一演示这些添加到LINQ中的内容: public class User {public string Name { g ...

  7. .NET 6新特性试用 | ArgumentNullException卫语句

    前言 在前面的文章中(<可空引用类型>),我们介绍过编译器会帮我们检查空引用,但是仅仅是警告.最好的方式还是在运行时用卫语句进行检查: private void Test(WeatherF ...

  8. .NET 6新特性试用 | 热重载

    前言 在以前的开发模式下,我们修改代码后必须重新编译.重新运行才能看到效果. 而热重载提供了这样一种特性,它允许你在项目正在运行时修改代码,并将代码更改立即应用于正在运行的应用程序上. 热重载的目的是 ...

  9. .NET 6新特性试用 | 最小Web API

    前言 如果你使用过其他一些轻量级Web框架,比如Node.JS,你就会知道,创建具有最小依赖项的HTTP API是多么简单: var express = require('express') var ...

最新文章

  1. 为什么蚂蚁永远不会堵车?
  2. oracle查看联机日志,oracle联机日志和归档日志
  3. UUID介绍与生成的方法
  4. java字符串10_十个最常见的Java字符串问题
  5. 英特尔软件学院与中国一起迎接2008
  6. 线段树hdu1754
  7. 终于有人把数据中台讲明白了
  8. JAVA day15 Collection(集合)、Iterator迭代器、泛型<E>
  9. 易优模板标签生成器发布(2018.9.12)
  10. vMotion、SvMotion、HA和FT的详细对比说明
  11. GIS案例练习-----------第五天
  12. 申请ARM DS-5单月试用版并安装
  13. python MDI窗口加载ui文件方法
  14. 【转载】用reshacker轻松修改系统OEM信息
  15. 【HDU2019多校】E - Snowy Smile (最大字段和)
  16. win10 powershell无法激活conda v4.9环境
  17. 4-2-1 求e的近似值 (15分)
  18. Neo4j在Windows下的安装,提供下载链接(官网忒慢)
  19. 桌面时钟(JS版本)-electron
  20. 酷点0.95发布,矩形框换肤、设置、独立开启……更酷啦

热门文章

  1. Fragment 键盘弹出方式设置
  2. 【DB2学习文档之七】SQL for DB2
  3. 我的新书,《人人都是产品经理》自序
  4. 33条C#、.Net经典面试题目及答案[zt]
  5. 连续投影算法_中航国画荣获“2020 IAV国际视听嘉年华” 大屏幕投影显示行业三大奖项!...
  6. Qt之水平/垂直布局(QBoxLayout、QHBoxLayout、QVBoxLayout)
  7. C#控件绑定数据源方式
  8. WPF将数据库和GridView绑定并更改GridView模板
  9. hdu 1800 (map)
  10. Ubuntu 下配置 NFS