如何延迟一个 Task 的执行 ?
生活随笔
收集整理的這篇文章主要介紹了
如何延迟一个 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 的执行 ?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Typora 开始收费, 不妨试试这个开
- 下一篇: 正式发布!Azure Functions