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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

如何延迟一个 Task 的执行 ?

發布時間:2023/12/4 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何延迟一个 Task 的执行 ? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

咨詢區

  • Bruno Lopes

我想實現一個可以在延遲 Xms 后執行一個 task 的需求,并要求能夠實現在 xms 之前取消 task 的執行,我的參考代碼如下:

var?_cancelationTokenSource?=?new?CancellationTokenSource();var?token?=?_cancelationTokenSource.Token; Task.Factory.StartNew(()?=>{token.ThrowIfCancellationRequested();Thread.Sleep(100);token.ThrowIfCancellationRequested();}).ContinueWith(t?=>{token.ThrowIfCancellationRequested();DoWork();token.ThrowIfCancellationRequested();},?token);

雖然用 Sleep + ContinueWith 的方式可以實現,但我覺得還不夠完美,請問是否有更好的辦法?

回答區

  • valentasm

你可以用 WaitOne 的另一個重載方法: Token.WaitHandle.WaitOne(int32 milliseconds), 它比Thread.Sleep(xxx) 🐂👃的地方在于,可以實現讓當前的線程等待xxx秒同時也可以在 xxxs 內被取消。

參考如下代碼:

static?void?Main(string[]?args) {var?tokenSource?=?new?CancellationTokenSource();var?token?=?tokenSource.Token;var?task?=?Task.Factory.StartNew(()?=>{//?wait?for?5?seconds?or?user?hit?Enter?key?cancel?the?tasktoken.WaitHandle.WaitOne(5000);token.ThrowIfCancellationRequested();Console.WriteLine("Task?started?its?work");});Console.WriteLine("Press?'Enter'?key?to?cancel?your?task");Console.Read();tokenSource.Cancel(); }
  • jyoung

如果你的程序是 .NET 4.5 以上或者 .netcore 的話,可以使用 Task.Delay() 來實現,非常方便,參考如下代碼:

static?void?Main(string[]?args){var?tokenSource?=?new?CancellationTokenSource();var?token?=?tokenSource.Token;tokenSource.Cancel();Task.Delay(1000,?token).ContinueWith(t?=>{Console.WriteLine("hello?world!");},token);Console.ReadLine();}
  • Dan Bryant

你可以在底層用 timer 作為調度機制,下面是我的完整代碼實現。

public?static?Task?StartDelayTask(int?delay,?CancellationToken?token){var?source?=?new?TaskCompletionSource<Object>();Timer?timer?=?null;timer?=?new?Timer(s?=>{source.TrySetResult(null);timer.Dispose();},?null,?delay,?-1);token.Register(()?=>?source.TrySetCanceled());return?source.Task;}public?static?Task?ContinueAfterDelay(this?Task?task,?int?delay,?Action<Task>?continuation,?CancellationToken?token){var?source?=?new?TaskCompletionSource<Object>();Timer?timer?=?null;var?startTimer?=?new?Action<Task>(t?=>{timer?=?new?Timer(s?=>{source.TrySetResult(null);timer.Dispose();},null,delay,-1);});task.ContinueWith(startTimer,?token,?TaskContinuationOptions.OnlyOnRanToCompletion,?TaskScheduler.Current);token.Register(()?=>?source.TrySetCanceled());return?source.Task.ContinueWith(continuation,?token);}

點評區

三種方式都很好,不過我個人更傾向于用 Task.Delay() ,學習了。

總結

以上是生活随笔為你收集整理的如何延迟一个 Task 的执行 ?的全部內容,希望文章能夠幫你解決所遇到的問題。

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