日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

.NET 6 新特性 PeriodicTimer

發布時間:2023/12/4 asp.net 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .NET 6 新特性 PeriodicTimer 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

.NET 6 新特性 PeriodicTimer

Intro

.NET 6 中引入了一個新的 Timer —— ?System.Threading.PeriodicTimer,和之前的幾個 Timer 相比一個最大的區別就是,新的 PeriodicTimer 的事件處理可以比較方便地使用異步方式,消除了使用 callback 的機制,減少了使用的復雜度。

Sample

來看一個使用示例:

using?var?cts?=?new?CancellationTokenSource(); Console.CancelKeyPress?+=?(sender,?e)?=> {e.Cancel?=?true;cts.Cancel(); };using?var?timer?=?new?PeriodicTimer(TimeSpan.FromSeconds(3)); try {while?(await?timer.WaitForNextTickAsync(cts.Token)){Console.WriteLine($"Timed?event?triggered({DateTime.Now:HH:mm:ss})");} } catch?(OperationCanceledException) {Console.WriteLine("Operation?cancelled"); }

通常 PeriodicTimer 可以結合 CancellationToken 一起使用,和 CancellationToken 一起用的時候需要注意,如果 cancellationToken 被取消的時候會拋出一個 OperationCanceledException 需要考慮自己處理異常

除此之外如果 PeriodicTimer 被 Dispose,這個 timer 就相當于是失效的,并且無法重新恢復,來看下面這個示例:

var?timer1?=?new?PeriodicTimer(TimeSpan.FromSeconds(2)); timer1.Dispose(); if?(await?timer1.WaitForNextTickAsync()) {Console.WriteLine("Timer1?event?triggered"); }

上面這樣的一段代碼,在 WaitForNextTickAsync 之前就已經調用了 Dispose(),此時 WaitForNextTickAsync 方法會始終返回 false ,所以 Console.WriteLine 的邏輯也不會被執行

我們之前會嘗試使用 Timer 來做一些后臺任務,可以改造成使用新的 PeriodicTimer 來實現,小示例如下:

public?abstract?class?TimerScheduledService?:?BackgroundService {private?readonly?PeriodicTimer?_timer;private?readonly?TimeSpan?_period;protected?readonly?ILogger?Logger;protected?TimerScheduledService(TimeSpan?period,?ILogger?logger){Logger?=?logger;_period?=?period;_timer?=?new?PeriodicTimer(_period);}protected?override?async?Task?ExecuteAsync(CancellationToken?stoppingToken){try{while?(await?_timer.WaitForNextTickAsync(stoppingToken)){try{Logger.LogInformation("Begin?execute?service");await?ExecuteInternal(stoppingToken);}catch?(Exception?ex){Logger.LogError(ex,?"Execute?exception");}finally{Logger.LogInformation("Execute?finished");}}}catch?(OperationCanceledException?operationCancelledException){Logger.LogWarning(operationCancelledException,?"service?stopped");}}protected?abstract?Task?ExecuteInternal(CancellationToken?stoppingToken);public?override?Task?StopAsync(CancellationToken?cancellationToken){Logger.LogInformation("Service?is?stopping.");_timer.Dispose();return?base.StopAsync(cancellationToken);} }

實現示例如下:

public?class?TimedHealthCheckService?:?TimerScheduledService {public?TimedHealthCheckService(ILogger<TimedHealthCheckService>?logger)?:?base(TimeSpan.FromSeconds(5),?logger){}protected?override?Task?ExecuteInternal(CancellationToken?stoppingToken){Logger.LogInformation("Executing...");return?Task.CompletedTask;} }

運行輸出如下:

logging output

More

新的 PeriodicTimer 相比之前的幾個 Timer 來說,有下面幾個特點

  • 沒有 callback 來綁定事件

  • 不會發生重入,只允許有一個消費者,不允許同一個 PeriodicTimer 在不同的地方同時 WaitForNextTickAsync,不需要自己做排他鎖來實現不能重入

  • 異步化,之前的幾個 timer 的 callback 都是同步的,使用新的 timer 我們可以更好的使用異步方法,避免寫 Sync over Async 之類的代碼

  • Dispose() 之后,該實例就無法再使用,WaitForNextTickAsync 始終返回 false

最后來做一個題目,把第一個示例改造一下,最終代碼如下:

using?var?cts?=?new?CancellationTokenSource(); cts.CancelAfter(TimeSpan.FromSeconds(30)); using?var?timer?=?new?PeriodicTimer(TimeSpan.FromSeconds(3)); try {while?(await?timer.WaitForNextTickAsync(cts.Token)){await?Task.Delay(5000);Console.WriteLine($"Timed?event?triggered({DateTime.Now:HH:mm:ss})");} } catch?(OperationCanceledException) {Console.WriteLine("Operation?cancelled"); }

猜一下輸出結果是什么,Timed event triggered 會輸出幾次

References

  • https://www.ilkayilknur.com/a-new-modern-timer-api-in-dotnet-6-periodictimer

  • https://docs.microsoft.com/en-us/dotnet/api/system.threading.periodictimer?view=net-6.0

  • https://github.com/dotnet/runtime/blob/v6.0.0/src/libraries/System.Private.CoreLib/src/System/Threading/PeriodicTimer.cs

  • https://github.com/dotnet/runtime/issues/31525

  • https://github.com/WeihanLi/SamplesInPractice/blob/master/net6sample/PeriodicTimerSample/Program.cs

  • https://github.com/OpenReservation/ReservationServer/blob/dev/OpenReservation.Helper/Services/CronScheduleServiceBase.cs#L91

總結

以上是生活随笔為你收集整理的.NET 6 新特性 PeriodicTimer的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 色噜噜成人 | 国产精品jizz在线观看软件 | 免费观看成年人网站 | 西西444www大胆无视频 | 蜜桃va | 美国美女黄色片 | 天天爽视频| 成年人在线视频观看 | 欧美成免费 | 自拍视频一区二区 | 亚洲裸体视频 | 国产精品亚洲天堂 | 久草手机在线观看 | 超碰av男人的天堂 | 欧美极品jizzhd欧美爆 | 国产精品va无码一区二区三区 | 2019国产在线 | 天天看片天天操 | 亚洲人成色777777精品音频 | 视频在线观看免费大片 | 尤物视频在线观看国产性感 | 一级毛片儿| 精品国产一区二区三区四区精华 | 久久久久久国产精品免费 | 亚洲午夜18毛片在线看 | 一本久久综合亚洲鲁鲁五月天 | 性色av一区二区三区 | 美女一级片 | 国产最新在线视频 | 中文字幕在线免费观看 | 亚洲精品久久久久久久久久久久久 | 欧美激情啪啪 | 色花堂在线 | 国产偷v国产偷v亚洲高清 | 日本黄色性视频 | 99re视频在线播放 | 日本黄色电影网址 | 精品国产视频一区二区 | 色版视频| 嫩草视频免费观看 | 国产高清一区在线观看 | 视频三区在线 | 97国产成人 | 日本一区二区免费在线 | 欧美xxxx中国 | 亚洲精品一区 | 国产一区二区三区久久久 | 国产高清亚洲 | 91av视频在线 | 另类小说婷婷 | 国产特级片 | 日本免费黄色网址 | 久久全国免费视频 | 在线视频 一区二区 | 亚洲精品乱码久久久久久蜜桃图片 | 波多野吉衣视频在线观看 | 中国浓毛少妇毛茸茸 | 日韩欧美日本 | 成人先锋av| 六月丁香久久 | 男女视频在线 | 亚洲第一女人av | 久久国内精品 | 最新中文字幕免费 | 精品一区二区三区免费毛片爱 | 四虎永久免费地址 | 亚洲天堂五月 | 亚洲天堂av电影 | 无码免费一区二区三区 | 欧美一级做性受免费大片免费 | 国产精品视频不卡 | 亚洲国产成人精品视频 | 国产精品久久久99 | 日日摸日日添日日碰9学生露脸 | 91福利一区二区 | 日韩精品一区二区亚洲av观看 | 午夜网址 | 小sao货cao死你 | 69热在线| 久久免费视频2 | 玖玖玖在线观看 | 成人综合影院 | 精品一区二区三区四 | 亚洲精选一区二区三区 | 青青草原av在线 | 人妻精品一区一区三区蜜桃91 | 亚洲三级在线 | 毛片在线免费观看网站 | 韩国一级淫片 | 国产a级黄色 | 韩国av免费在线 | 麻豆成人入口 | 国产女主播在线一区二区 | 欧美特级毛片 | 神马伦理影视 | 91沈先生在线 | aaa成人 | 亚洲色图五月天 | 久操影视|