.NET 6新特性試用Timer類之PeriodicTimer?
前言:
在.NET中,已經(jīng)存在了5個Timer類:
System.Threading.Timer System.Timers.Timer System.Web.UI.Timer System.Windows.Forms.Timer System.Windows.Threading.DispatcherTimer
不管以前這樣設(shè)計的原因,現(xiàn)在.NET 6又為我們增加了一個新Timer
,??PeriodicTimer
??。
這又是為什么呢?
一、Demo
與其他Timer需要創(chuàng)建事件回調(diào)不同:
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))) { ? ? //在到達指定周期后執(zhí)行方法 ? ? while (await timer.WaitForNextTickAsync()) ? ? { ? ? ? ? await Task.Delay(3000); ? ? ? ? ? Console.WriteLine($"Timer Thread: {Thread.CurrentThread.ManagedThreadId}"); ? ? ? ? Console.WriteLine($"{DateTime.Now.Second} PeriodicTimer tick"); ? ? } }
?從??await
??關(guān)鍵字可以看出,PeriodicTimer
用于異步執(zhí)行;并且一次只有一個線程可以執(zhí)行。
另外,你可以控制?停止PeriodicTimer計時?。示例代碼如下:
//創(chuàng)建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"); ? ? } }
需要注意的是,這會引發(fā)??OperationCancelled??異常,你需要捕獲該異常,然后根據(jù)需要進行處理:
當(dāng)然,你也可以通過主動取消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) ? ? ? ? { ? ? ? ? ? ? //執(zhí)行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) ? ? ? ? { ? ? ? ? ? ? //執(zhí)行3次后取消 ? ? ? ? ? ? timer.Dispose(); ? ? ? ? } ? ? ? ? Console.WriteLine($"{DateTime.Now.Second} PeriodicTimer tick"); ? ? } }
結(jié)論:
通過上面的代碼,可以了解到,設(shè)計PeriodicTimer的原因,可以歸結(jié)為:
- 用于異步上下文
- 一次僅由一個消費者使用?
到此這篇關(guān)于.NET 6新特性試用Timer類之PeriodicTimer 的文章就介紹到這了,更多相關(guān)Timer類之PeriodicTimer 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
利用.NET 開發(fā)服務(wù)器 應(yīng)用管理工具
這篇文章主要介紹如何利用.NET 開發(fā)一個應(yīng)用管理工具的服務(wù)器,文章回先聊背景接著其是喲美好方法,需要的的小伙伴可以參考一下小面文章的具體內(nèi)容2021-10-10利用ASP.NET技術(shù)動態(tài)生成HTML頁面
利用ASP.NET技術(shù)動態(tài)生成HTML頁面...2006-07-07ABP入門系列應(yīng)用BootstrapTable表格插件
Bootstrap table是一個開源的輕量級功能非常豐富的前端表格插件。下面通過本文給大家介紹ABP入門系列應(yīng)用BootstrapTable表格插件,感興趣的朋友一起學(xué)習(xí)吧2017-03-03.Net Core HttpClient處理響應(yīng)壓縮詳細
.Net Core作為后起之秀直接將HttpClient扶正,并且在此基礎(chǔ)上改良了HttpClientFactory,接下來我們就來探究一下在.Net Core中使用HttpClient處理響應(yīng)壓縮的機制。,需要的朋友可以參考下面文章的具體內(nèi)容2021-09-09asp.net mvc路由篇 如何找到 IHttpHandler方法介紹
學(xué)習(xí)是使用asp.net已經(jīng)有很長一段時間了,現(xiàn)在就來分析一下mvc的整過過程吧。個人計劃寫一個mvc系列的博文,僅從源代碼的角度來分析mvc。在接觸mvc時我們一定會經(jīng)歷路由,那么路由這東東是怎么搞出來的啊2012-11-11為什么ASP.NET Core 數(shù)據(jù)庫連接串的值和appsettings.json配的不一樣?
這篇文章主要介紹了為什么數(shù)據(jù)庫連接串的值和appsettings.json配的不一樣?下面我們就帶著疑問閱讀下文,需要的小伙伴可以參考一下,希望對你有所幫助2022-02-02