Как поставить задачу для сна (или задержки) в C # 4.0?

В .NET 4.5 есть Task.Delay

Как я могу сделать то же самое в .NET 4.0?

Вы можете использовать Timer для создания метода Delay в 4.0:

 public static Task Delay(double milliseconds) { var tcs = new TaskCompletionSource(); System.Timers.Timer timer = new System.Timers.Timer(); timer.Elapsed+=(obj, args) => { tcs.TrySetResult(true); }; timer.Interval = milliseconds; timer.AutoReset = false; timer.Start(); return tcs.Task; } 

Используйте пакет Microsoft.Bcl.Async от NuGet, у него есть TaskEx.Delay .

 using System; using System.Threading; using System.Threading.Tasks; class Program { static void Main() { Delay(2000).ContinueWith(_ => Console.WriteLine("Done")); Console.Read(); } static Task Delay(int milliseconds) { var tcs = new TaskCompletionSource(); new Timer(_ => tcs.SetResult(null)).Change(milliseconds, -1); return tcs.Task; } } 

Из раздела Как реализовать Task.Delay в 4.0

Ниже приведен код и образец жгута прошивки для отмены Task.Delay. Вероятно, вы заинтересованы в методе Delay :

 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DelayImplementation { class Program { static void Main(string[] args) { System.Threading.CancellationTokenSource tcs = new System.Threading.CancellationTokenSource(); int id = 1; Console.WriteLine(string.Format("Starting new delay task {0}. This one will be cancelled.", id)); Task delayTask = Delay(8000, tcs.Token); HandleTask(delayTask, id); System.Threading.Thread.Sleep(2000); tcs.Cancel(); id = 2; System.Threading.CancellationTokenSource tcs2 = new System.Threading.CancellationTokenSource(); Console.WriteLine(string.Format("Starting delay task {0}. This one will NOT be cancelled.", id)); var delayTask2 = Delay(4000, tcs2.Token); HandleTask(delayTask2, id); System.Console.ReadLine(); } private static void HandleTask(Task delayTask, int id) { delayTask.ContinueWith(p => Console.WriteLine(string.Format("Task {0} was cancelled.", id)), TaskContinuationOptions.OnlyOnCanceled); delayTask.ContinueWith(p => Console.WriteLine(string.Format("Task {0} was completed.", id)), TaskContinuationOptions.OnlyOnRanToCompletion); } static Task Delay(int delayTime, System.Threading.CancellationToken token) { TaskCompletionSource tcs = new TaskCompletionSource(); if (delayTime < 0) throw new ArgumentOutOfRangeException("Delay time cannot be under 0"); System.Threading.Timer timer = null; timer = new System.Threading.Timer(p => { timer.Dispose(); //stop the timer tcs.TrySetResult(null); //timer expired, attempt to move task to the completed state. }, null, delayTime, System.Threading.Timeout.Infinite); token.Register(() => { timer.Dispose(); //stop the timer tcs.TrySetCanceled(); //attempt to mode task to canceled state }); return tcs.Task; } } } 

Расширение идеи из этого ответа :

 new AutoResetEvent(false).WaitOne(1000); 

Во многих случаях чистый AutoResetEvent лучше, чем Thread.Sleep () …

 AutoResetEvent pause = new AutoResetEvent(false); Task timeout = Task.Factory.StartNew(()=>{ pause.WaitOne(1000, true); }); 

надеюсь, что это поможет

Вы можете загрузить Visual Studio Async CTP и использовать TaskEx.Delay

  public static void DelayExecute(double delay, Action actionToExecute) { if (actionToExecute != null) { var timer = new DispatcherTimer { Interval = TimeSpan.FromMilliseconds(delay) }; timer.Tick += (delegate { timer.Stop(); actionToExecute(); }); timer.Start(); } } 

Вот краткая, основанная на таймере реализация с правильной очисткой:

 var wait = new TaskCompletionSource(); using (new Timer(_ => wait.SetResult(false), null, delay, Timeout.Infinite)) await wait.Task; 

Чтобы использовать этот код в .NET 4.0, вам нужен пакет Microsoft.Bcl.Async NuGet.

Interesting Posts
Давайте будем гением компьютера.