.NET 6新特性试用 | PeriodicTimer
前言
在.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相关推荐
- .NET 6新特性试用 | 总结:我最喜欢的5个特性
前言 不知不觉,<.NET 6新特性试用>系列文章已经写了20多篇,而今天终于要告一段落了. 如果你还没有看过,详细文章列表在这里: .NET 6新特性试用系列 在这么多特性中,我最喜欢如 ...
- .NET 6新特性试用 | 可空引用类型
前言 在查看<隐式using指令>功能时,我们在csproj中发现这样一个属性: 那么,Nullable到底是干嘛的? 可为空上下文 严格来说,这不是新特性,而是C# 8.0引入的特性之一 ...
- 5.0 新特性试用体验之 Clustered Index
作者:hzc989 原文来源: https://tidb.net/blog/69dd056c [是否原创]是 [首发渠道]TiDB 社区 [目录] 一.引言 二.基础前情回顾 三.era withou ...
- .NET 6新特性试用 | 可写JSON DOM API
前言 我们常用JSON的方式,是将类对象序列化/反序列化: var user = new User { Name = "My IO" }; var json = JsonSeria ...
- .NET 6新特性试用 | SDK工作负载
前言 为了应对.NET SDK能够支持的程序集项目(例如iOS.Android.WASM)的不断增长,从.NET 6开始,允许用户仅安装必要的SDK(例如ASP.NET Core),而不是一次性安装& ...
- .NET 6新特性试用 | LINQ功能改进
前言 .NET6为LINQ添加了多个新API,在本文中,我们将始终使用User类逐一演示这些添加到LINQ中的内容: public class User {public string Name { g ...
- .NET 6新特性试用 | ArgumentNullException卫语句
前言 在前面的文章中(<可空引用类型>),我们介绍过编译器会帮我们检查空引用,但是仅仅是警告.最好的方式还是在运行时用卫语句进行检查: private void Test(WeatherF ...
- .NET 6新特性试用 | 热重载
前言 在以前的开发模式下,我们修改代码后必须重新编译.重新运行才能看到效果. 而热重载提供了这样一种特性,它允许你在项目正在运行时修改代码,并将代码更改立即应用于正在运行的应用程序上. 热重载的目的是 ...
- .NET 6新特性试用 | 最小Web API
前言 如果你使用过其他一些轻量级Web框架,比如Node.JS,你就会知道,创建具有最小依赖项的HTTP API是多么简单: var express = require('express') var ...
最新文章
- 为什么蚂蚁永远不会堵车?
- oracle查看联机日志,oracle联机日志和归档日志
- UUID介绍与生成的方法
- java字符串10_十个最常见的Java字符串问题
- 英特尔软件学院与中国一起迎接2008
- 线段树hdu1754
- 终于有人把数据中台讲明白了
- JAVA day15 Collection(集合)、Iterator迭代器、泛型<E>
- 易优模板标签生成器发布(2018.9.12)
- vMotion、SvMotion、HA和FT的详细对比说明
- GIS案例练习-----------第五天
- 申请ARM DS-5单月试用版并安装
- python MDI窗口加载ui文件方法
- 【转载】用reshacker轻松修改系统OEM信息
- 【HDU2019多校】E - Snowy Smile (最大字段和)
- win10 powershell无法激活conda v4.9环境
- 4-2-1 求e的近似值 (15分)
- Neo4j在Windows下的安装,提供下载链接(官网忒慢)
- 桌面时钟(JS版本)-electron
- 酷点0.95发布,矩形框换肤、设置、独立开启……更酷啦
热门文章
- Fragment 键盘弹出方式设置
- 【DB2学习文档之七】SQL for DB2
- 我的新书,《人人都是产品经理》自序
- 33条C#、.Net经典面试题目及答案[zt]
- 连续投影算法_中航国画荣获“2020 IAV国际视听嘉年华” 大屏幕投影显示行业三大奖项!...
- Qt之水平/垂直布局(QBoxLayout、QHBoxLayout、QVBoxLayout)
- C#控件绑定数据源方式
- WPF将数据库和GridView绑定并更改GridView模板
- hdu 1800 (map)
- Ubuntu 下配置 NFS