异步延迟

  1. //创建一个在指定的毫秒数后完成的任务。
  2. public static Task Delay(int millisecondsDelay);
  3. //创建一个在指定的毫秒数后完成的可取消任务。
  4. public static Task Delay(TimeSpan delay, CancellationToken cancellationToken);

简单用法

  1. public static void Main()
  2. {
  3. var t = Task.Run(async delegate
  4. {
  5. await Task.Delay(1000);
  6. return 42;
  7. });
  8. t.Wait();
  9. Console.WriteLine("Task t Status: {0}, Result: {1}",
  10. t.Status, t.Result);
  11. }
  • 下面的例子启动了一个Task,该Task包含对Delay(Int32, CancellationToken)方法的调用,延迟时间为一秒。
  • token将在延迟时间间隔到期前被取消。因此将引发一个TaskCanceledException,并且Task.Status的属性被设置为Canceled。
  1. public static void Main()
  2. {
  3. CancellationTokenSource source = new CancellationTokenSource();
  4. var t = Task.Run(async delegate
  5. {
  6. await Task.Delay(1000, source.Token);
  7. return 42;
  8. });
  9. source.Cancel();
  10. try
  11. {
  12. t.Wait();
  13. }
  14. catch (AggregateException ae)
  15. {
  16. foreach (var e in ae.InnerExceptions)
  17. Console.WriteLine("{0}: {1}", e.GetType().Name, e.Message);
  18. }
  19. Console.Write("Task t Status: {0}", t.Status);
  20. if (t.Status == TaskStatus.RanToCompletion)
  21. Console.Write(", Result: {0}", t.Result);
  22. source.Dispose();
  23. }
  • 下面的例子用Task.Delay实现了一个简单的超时功能:
  1. static async Task<string> DownloadStringWithTimeout(string uri)
  2. {
  3. using (var client = new HttpClient())
  4. {
  5. var downloadTask = client.GetStringAsync(uri);
  6. var timeoutTask = Task.Delay(3000);
  7. //如果服务在3秒内没有响应,就返回null
  8. var completedTask = await Task.WhenAny(downloadTask, timeoutTask);
  9. if (completedTask == timeoutTask)
  10. return null;
  11. return await downloadTask;
  12. }
  13. }