.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
);

decafa054ebbbc7289eb9a9615fb05ba.png

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");}
}

1fcf6b2423eb1e7b19e5734283c8daa9.png

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异常,你需要捕获该异常,然后根据需要进行处理:

b697cd0b141f5cbe20832b9c29a2b30a.png

当然,你也可以通过主动取消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异常:

5f624ba6b54b1a65d615f0d1bc861277.png

如果,你不想抛出异常,则可以用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");}
}

91266841d5d63dfb323d72585f6ec2e4.png

结论

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

  • 用于异步上下文

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/293600.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

shell--指“提供使用者使用界面”的软件(命令解析器)

在计算机科学中,Shell俗称壳(用来区别于核), 是指“提供使用者使用界面”的软件(命令解析器)。 它类似于DOS下的command.com。它接收用户命令,然后调用相应的应用程序。同时它又是一种程序设计语…

《SAS编程与数据挖掘商业案例》学习笔记之十三

本次重点:data步循环与控制 涉及:if/then/else语句,select语句,do语句,continue语句,leave语句 1.if then else 语句 高效率的if应用: 1) If x1 then y1; Else if x2 then y2; Els…

ChatForFun 公众号使用说明

使用方法 2016-07-16 DennisMi ChatForFun1,发送 #1 实现登陆,或者退出登陆 2,发送 #2 实现加入聊天,和退出聊天 3,聊天开始后,可以直接发送消息 4,如果需要退出登陆或者退出聊天,…

sessionfunctionphp实战第六天

最近研究sessionfunction,稍微总结一下,以后继续补充: 今天学习了做后台页面,很失败就不展示了。 php方面:以下代码可以屏蔽php注意级别的错误,即 抛出任何非注意错误 error_reporting(E_ALL&~E_NOTICE…

利用WebBrowser实现Web打印的分析

利用WebBrowser实现Web打印的分析 原文:利用WebBrowser实现Web打印的分析WebBrowser是IE内置的浏览器控件,无需用户下载。本文档所讨论的是有关IE6.0版本的WebBrowser控件技术内容。其他版本的IE应该也支持。与其相关的技术要求有:打印文档的生成、页面设…

强大的grep命令

强大的grep命令网上关于grep命令的解释一搜一大堆,基本都是把man命令大致翻译了一下,说实话,看完就忘!个人认为,学习命令最好的方式就是模拟真实环境,写出一些可能用到的命令组合,然后慢慢消化&…

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

前言不知不觉,《.NET 6新特性试用》系列文章已经写了20多篇,而今天终于要告一段落了。如果你还没有看过,详细文章列表在这里:.NET 6新特性试用系列在这么多特性中,我最喜欢如下5个特性:1、最小Web API仅需三…

《SAS编程与数据挖掘商业案例》学习笔记之十二

本次重点在:sas数据集管理 主要包括:包括数据集纵向拼接、转置、排序、比较、复制、重命名、删除等 1.append语句 注:base数据集和data两个数据集必须结构一样,避免使用force的情况,重复append的会造成重复。 一个避…

mikrotikROS系统的几种安装方法

这里简单介绍下几种ROS的安装方法,以及适用于哪些设备,这里我们先提供一个ROS6.0全系列版本的下载链接mikrotik-RouteOS-V6.0正式版下载 或者前往官方下载最新版常见的ROS硬件一般分为:X86架构(也是最常用的)mipsbe(欧米tik,部分RB系列,SXT,Groove等)mipsle(RBC系列,RB100,R…

分布式云+dubbo+zookeeper+Springmvc整合

2019独角兽企业重金招聘Python工程师标准>>> Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可,Dubbo基于Spring的Schema扩展进行加载。 一:单机模式安装…

.Net下你不得不看的分表分库解决方案-多字段分片

介绍本期主角:ShardingCore 一款ef-core下高性能、轻量级针对分表分库读写分离的解决方案,具有零依赖、零学习成本、零业务代码入侵dotnet下唯一一款全自动分表,多字段分表框架,拥有高性能,零依赖、零学习成本、零业务代码入侵,并且支持读写分离动态分表分库,同一种…

知乎高赞:看懂这个颠覆世界观的认知,远比做1000道题更有用!

▲ 点击查看知乎上曾有个提问:“见过世面究竟有多重要?”其中一个点赞过万回答让无数网友产生共鸣:会讲究,能将就,能享受最好的,也能承受最坏的。见过世面的他们自然会在人群中散发不一样的气质&#xff0c…

Linux之VI命令详解

vi是所有UNIX系统都会提供的屏幕编辑器,它提供了一个视窗设备,通过它可以编辑文件。当然,对UNIX系统略有所知的人, 或多或少都觉得vi超级难用,但vi是最基本的编辑器,所以希望读者能好好把它学起来&#xff…

WebBrowser!

WebBrowser! 原文:WebBrowser!我现在先放一些基础的文章在这里,以后再放别的上来官方范例连接http://www.microsoft.com/china/msdn/library/langtool/vcsharp/OvervwWebBrowExp.mspxQ&A 2005年5月21日 0:14:19 Q: 新键入的地址不能在新建好的窗口里打开:A:每…

Android USB Host与HID通讯(二)

2019独角兽企业重金招聘Python工程师标准>>> 原文出处:http://han21912.lofter.com/post/c3919_51401d 接上一篇:Android USB Host与HID通讯 (一) 从上篇已经可以枚举到HID设备,接下来看看寻找设备的接口和通信端点,…

数据挖掘技术在信用卡业务中的应用及实例分析

信用卡业务具有透支笔数巨大、单笔金额小的特点,这使得数据挖掘技术在信用卡业务中的应用成为必然。国外信用卡发卡机构已经广泛应用数据挖掘技术促进信用卡业务的发展,实现全面的绩效管理。我国自1985年发行第一张信用卡以来,信用卡业务得到…

ubuntu之find方法

linux 下的find 命令 小总结..谢谢大家赏光!通用格式:find pathname -options [-print -exec -ok]例子:find / -name filename 再根目录里面搜索文件名为filename的文件find /etc -name *s*在目录里面搜索带有s的文件find /etc -name *S 在目录里面搜索以s结尾的文件find /etc …

CentOS7安装PHP5.6.23

为什么80%的码农都做不了架构师?>>> 美国时间2014年11月13日,PHP开发团队,在「PHP 5.6.3 is available|PHP: Hypertext Preprocessor」上公布了PHP5.6系的最新版本「PHP 5.6.3」。 在最新的版本5.6.3不仅修改了多个Bu…

使用 Apache Pig 处理数据5

使用 Apache Pig 从大数据集中获得所需的信息 Apache Pig 是一个高级过程语言,适合于使用 Hadoop 和 MapReduce 平台来查询大型半结构化数据集。通过允许对分布式数据集进行类似 SQL 的查询,Pig 可以简化 Hadoop 的使用。本文将探索 Pig 背后的语言&…