Task.Delay 方法 
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
创建一个任务,该任务将在时间延迟后完成。
重载
| Delay(Int32) | 创建在指定毫秒数后完成的任务。 | 
| Delay(TimeSpan) | 创建在指定时间间隔后完成的任务。 | 
| Delay(Int32, CancellationToken) | 创建在指定毫秒数后完成的可取消任务。 | 
| Delay(TimeSpan, CancellationToken) | 创建在指定时间间隔后完成的可取消任务。 | 
| Delay(TimeSpan, TimeProvider) | 创建在指定时间间隔后完成的任务。 | 
| Delay(TimeSpan, TimeProvider, CancellationToken) | 创建在指定时间间隔后完成的可取消任务。 | 
Delay(Int32)
- Source:
- Task.cs
- Source:
- Task.cs
- Source:
- Task.cs
创建在指定毫秒数后完成的任务。
public:
 static System::Threading::Tasks::Task ^ Delay(int millisecondsDelay);public static System.Threading.Tasks.Task Delay (int millisecondsDelay);static member Delay : int -> System.Threading.Tasks.TaskPublic Shared Function Delay (millisecondsDelay As Integer) As Task参数
- millisecondsDelay
- Int32
完成返回的任务之前等待的毫秒数,或 -1 无限期等待。
返回
表示时间延迟的任务。
例外
              millisecondsDelay 参数小于 -1。
示例
以下示例演示了 Delay 方法的简单用法。
using System;
using System.Threading.Tasks;
public class Example
{
   public static void Main()
   {
      var t = Task.Run(async delegate
              {
                 await Task.Delay(1000);
                 return 42;
              });
      t.Wait();
      Console.WriteLine("Task t Status: {0}, Result: {1}",
                        t.Status, t.Result);
   }
}
// The example displays the following output:
//        Task t Status: RanToCompletion, Result: 42
open System.Threading.Tasks
let t =
    Task.Run<int>(fun () ->
        task {
            do! Task.Delay 1000
            return 42
        })
t.Wait()
printfn $"Task t Status: {t.Status}, Result: {t.Result}"
// The example displays the following output:
//        Task t Status: RanToCompletion, Result: 42
Imports System.Threading.Tasks
Module Example
   Public Sub Main()
      Dim t = Task.Run(Async Function()
                                Await Task.Delay(1000)
                                Return 42
                       End Function)
      t.Wait()
      Console.WriteLine("Task t Status: {0}, Result: {1}",
                        t.Status, t.Result)
   End Sub
End Module
' The example displays the following output:
'       Task t Status: RanToCompletion, Result: 42
注解
Delay 方法通常用于延迟指定时间间隔内任务的全部或部分操作。 最常见的是引入时间延迟:
- 在任务的开头,如以下示例所示。 - Stopwatch sw = Stopwatch.StartNew(); var delay = Task.Delay(1000).ContinueWith(_ => { sw.Stop(); return sw.ElapsedMilliseconds; } ); Console.WriteLine("Elapsed milliseconds: {0}", delay.Result); // The example displays output like the following: // Elapsed milliseconds: 1013- let sw = Stopwatch.StartNew() let delay = Task .Delay(1000) .ContinueWith(fun _ -> sw.Stop() sw.ElapsedMilliseconds) printfn $"Elapsed milliseconds: {delay.Result}" // The example displays output like the following: // Elapsed milliseconds: 1013- Dim sw As Stopwatch = Stopwatch.StartNew() Dim delay1 = Task.Delay(1000) Dim delay2 = delay1.ContinueWith( Function(antecedent) sw.Stop() Return sw.ElapsedMilliseconds End Function) Console.WriteLine("Elapsed milliseconds: {0}", delay2.Result) ' The example displays output like the following: ' Elapsed milliseconds: 1013
- 任务正在执行时。 在这种情况下,对 Delay 方法的调用在任务中作为子任务执行,如以下示例所示。 请注意,由于调用 Delay 方法的任务以异步方式执行,因此父任务必须等待它使用 - await关键字完成。- var delay = Task.Run( async () => { Stopwatch sw = Stopwatch.StartNew(); await Task.Delay(2500); sw.Stop(); return sw.ElapsedMilliseconds; }); Console.WriteLine("Elapsed milliseconds: {0}", delay.Result); // The example displays output like the following: // Elapsed milliseconds: 2501- let delay = Task.Run<int64>(fun () -> task { let sw = Stopwatch.StartNew() do! Task.Delay 2500 sw.Stop() return sw.ElapsedMilliseconds }) printfn $"Elapsed milliseconds: {delay.Result}" // The example displays output like the following: // Elapsed milliseconds: 2501- Dim delay = Task.Run( Async Function() Dim sw As Stopwatch = Stopwatch.StartNew() Await Task.Delay(2500) sw.Stop() Return sw.ElapsedMilliseconds End Function ) Console.WriteLine("Elapsed milliseconds: {0}", delay.Result) ' The example displays output like the following: ' Elapsed milliseconds: 2501
在指定的时间延迟后,任务将处于 RanToCompletion 状态完成。
此方法取决于系统时钟。 这意味着,如果 millisecondsDelay 参数小于系统时钟的分辨率,则时间延迟大约等于系统时钟的分辨率,而 Windows 系统上的分辨率约为 15 毫秒。
注意
所使用的系统时钟与 GetTickCount使用的时钟相同,这不受 timeBeginPeriod 和 timeEndPeriod所做的更改的影响。
适用于
Delay(TimeSpan)
- Source:
- Task.cs
- Source:
- Task.cs
- Source:
- Task.cs
创建在指定时间间隔后完成的任务。
public:
 static System::Threading::Tasks::Task ^ Delay(TimeSpan delay);public static System.Threading.Tasks.Task Delay (TimeSpan delay);static member Delay : TimeSpan -> System.Threading.Tasks.TaskPublic Shared Function Delay (delay As TimeSpan) As Task参数
- delay
- TimeSpan
完成返回的任务之前要等待的时间跨度,或 Timeout.InfiniteTimeSpan 无限期等待。
返回
表示时间延迟的任务。
例外
              delay 表示除 Timeout.InfiniteTimeSpan以外的负时间间隔。
-或-
              delay 参数的 TotalMilliseconds 属性大于 .NET 6 及更高版本上的4294967294,或者在所有以前的版本中 Int32.MaxValue。
示例
以下示例演示了 Delay 方法的简单用法。
using System;
using System.Threading.Tasks;
public class Example
{
   public static void Main()
   {
      var t = Task.Run(async delegate
              {
                 await Task.Delay(TimeSpan.FromSeconds(1.5));
                 return 42;
              });
      t.Wait();
      Console.WriteLine("Task t Status: {0}, Result: {1}",
                        t.Status, t.Result);
   }
}
// The example displays the following output:
//        Task t Status: RanToCompletion, Result: 42
open System
open System.Threading.Tasks
let t =
    Task.Run<int>(fun () ->
        task {
            do! Task.Delay(TimeSpan.FromSeconds 1.5)
            return 42
        })
t.Wait()
printfn $"Task t Status: {t.Status}, Result: {t.Result}"
// The example displays the following output:
//        Task t Status: RanToCompletion, Result: 42
Imports System.Threading.Tasks
Module Example
   Public Sub Main()
      Dim t = Task.Run(Async Function()
                                Await Task.Delay(TimeSpan.FromSeconds(1.5))
                                Return 42
                       End Function)
      t.Wait()
      Console.WriteLine("Task t Status: {0}, Result: {1}",
                        t.Status, t.Result)
   End Sub
End Module
' The example displays the following output:
'       Task t Status: RanToCompletion, Result: 42
注解
在指定的时间延迟后,任务以 RanToCompletion 状态完成。
有关使用方案和其他示例,请参阅 Delay(Int32) 重载的文档。
此方法取决于系统时钟。 这意味着,如果 delay 参数小于系统时钟的分辨率,则时间延迟大约等于系统时钟的分辨率,而 Windows 系统上的分辨率约为 15 毫秒。
注意
所使用的系统时钟与 GetTickCount使用的时钟相同,这不受 timeBeginPeriod 和 timeEndPeriod所做的更改的影响。
适用于
Delay(Int32, CancellationToken)
- Source:
- Task.cs
- Source:
- Task.cs
- Source:
- Task.cs
创建在指定毫秒数后完成的可取消任务。
public:
 static System::Threading::Tasks::Task ^ Delay(int millisecondsDelay, System::Threading::CancellationToken cancellationToken);public static System.Threading.Tasks.Task Delay (int millisecondsDelay, System.Threading.CancellationToken cancellationToken);static member Delay : int * System.Threading.CancellationToken -> System.Threading.Tasks.TaskPublic Shared Function Delay (millisecondsDelay As Integer, cancellationToken As CancellationToken) As Task参数
- millisecondsDelay
- Int32
完成返回的任务之前等待的毫秒数,或 -1 无限期等待。
- cancellationToken
- CancellationToken
等待任务完成时要观察的取消令牌。
返回
表示时间延迟的任务。
例外
              millisecondsDelay 参数小于 -1。
任务已被取消。 此异常存储在返回的任务中。
已释放提供的 cancellationToken。
任务已被取消。
示例
以下示例启动一个任务,该任务包含对 Delay(Int32, CancellationToken) 方法的调用,但延迟为 1 秒。 在延迟间隔过前,令牌将被取消。 该示例的输出显示,因此会引发 TaskCanceledException,并将任务的 Status 属性设置为 Canceled。
using System;
using System.Threading;
using System.Threading.Tasks;
public class Example
{
   public static void Main()
   {
      CancellationTokenSource source = new CancellationTokenSource();
      var t = Task.Run(async delegate
              {
                 await Task.Delay(1000, source.Token);
                 return 42;
              });
      source.Cancel();
      try {
         t.Wait();
      }
      catch (AggregateException ae) {
         foreach (var e in ae.InnerExceptions)
            Console.WriteLine("{0}: {1}", e.GetType().Name, e.Message);
      }
      Console.Write("Task t Status: {0}", t.Status);
      if (t.Status == TaskStatus.RanToCompletion)
         Console.Write(", Result: {0}", t.Result);
      source.Dispose();
   }
}
// The example displays the following output:
//       TaskCanceledException: A task was canceled.
//       Task t Status: Canceled
open System
open System.Threading
open System.Threading.Tasks
let source = new CancellationTokenSource()
let t =
    Task.Run<int>(fun () ->
        task {
            do! Task.Delay(1000, source.Token)
            return 42
        })
source.Cancel()
try
    t.Wait()
with :? AggregateException as ae ->
    for e in ae.InnerExceptions do
        printfn $"{e.GetType().Name}: {e.Message}"
printf $"Task t Status: {t.Status}"
if t.Status = TaskStatus.RanToCompletion then
    printf $", Result: {t.Result}"
source.Dispose()
// The example displays the following output:
//       TaskCanceledException: A task was canceled.
//       Task t Status: Canceled
Imports System.Threading
Imports System.Threading.Tasks
Module Example
   Public Sub Main()
      Dim source As New CancellationTokenSource()
      
      Dim t = Task.Run(Async Function()
                                Await Task.Delay(1000, source.Token)
                                Return 42
                       End Function)
      source.Cancel()
      Try
         t.Wait()
      Catch ae As AggregateException
         For Each e In ae.InnerExceptions
            Console.WriteLine("{0}: {1}", e.GetType().Name, e.Message)
         Next
      End Try
      Console.Write("Task t Status: {0}", t.Status)
      If t.Status = TaskStatus.RanToCompletion Then
         Console.Write(", Result: {0}", t.Result)
      End If
      source.Dispose()
   End Sub
End Module
' The example displays the following output:
'       TaskCanceledException: A task was canceled.
'       Task t Status: Canceled
注解
如果在指定的时间延迟之前发出取消令牌的信号,则 TaskCanceledException 异常结果,并且任务在 Canceled 状态下完成。 否则,任务在指定的时间延迟过后处于 RanToCompletion 状态完成。
有关使用方案和其他示例,请参阅 Delay(Int32) 重载的文档。
此方法取决于系统时钟。 这意味着,如果 millisecondsDelay 参数小于系统时钟的分辨率,则时间延迟大约等于系统时钟的分辨率,而 Windows 系统上的分辨率约为 15 毫秒。
注意
所使用的系统时钟与 GetTickCount使用的时钟相同,这不受 timeBeginPeriod 和 timeEndPeriod所做的更改的影响。
适用于
Delay(TimeSpan, CancellationToken)
- Source:
- Task.cs
- Source:
- Task.cs
- Source:
- Task.cs
创建在指定时间间隔后完成的可取消任务。
public:
 static System::Threading::Tasks::Task ^ Delay(TimeSpan delay, System::Threading::CancellationToken cancellationToken);public static System.Threading.Tasks.Task Delay (TimeSpan delay, System.Threading.CancellationToken cancellationToken);static member Delay : TimeSpan * System.Threading.CancellationToken -> System.Threading.Tasks.TaskPublic Shared Function Delay (delay As TimeSpan, cancellationToken As CancellationToken) As Task参数
- delay
- TimeSpan
完成返回的任务之前要等待的时间跨度,或 Timeout.InfiniteTimeSpan 无限期等待。
- cancellationToken
- CancellationToken
等待任务完成时要观察的取消令牌。
返回
表示时间延迟的任务。
例外
              delay 表示除 Timeout.InfiniteTimeSpan以外的负时间间隔。
-或-
              delay 参数的 TotalMilliseconds 属性大于 .NET 6 及更高版本上的4294967294,或者在所有以前的版本中 Int32.MaxValue。
任务已被取消。 此异常存储在返回的任务中。
已释放提供的 cancellationToken。
任务已被取消。
示例
以下示例启动一个任务,该任务包含对 Delay(TimeSpan, CancellationToken) 方法的调用,延迟为 1.5 秒。 在延迟间隔过前,令牌将被取消。 该示例的输出显示,因此会引发 TaskCanceledException,并将任务的 Status 属性设置为 Canceled。
using System;
using System.Threading;
using System.Threading.Tasks;
public class Example
{
   public static void Main()
   {
      CancellationTokenSource source = new CancellationTokenSource();
      var t = Task.Run(async delegate
              {
                 await Task.Delay(TimeSpan.FromSeconds(1.5), source.Token);
                 return 42;
              });
      source.Cancel();
      try {
         t.Wait();
      }
      catch (AggregateException ae) {
         foreach (var e in ae.InnerExceptions)
            Console.WriteLine("{0}: {1}", e.GetType().Name, e.Message);
      }
      Console.Write("Task t Status: {0}", t.Status);
      if (t.Status == TaskStatus.RanToCompletion)
         Console.Write(", Result: {0}", t.Result);
      source.Dispose();
   }
}
// The example displays output like the following:
//       TaskCanceledException: A task was canceled.
//       Task t Status: Canceled
open System
open System.Threading
open System.Threading.Tasks
let source = new CancellationTokenSource()
let t =
    Task.Run<int>(fun () ->
        task {
            do! Task.Delay(TimeSpan.FromSeconds(1.5), source.Token)
            return 42
        })
source.Cancel()
try
    t.Wait()
with :? AggregateException as ae ->
    for e in ae.InnerExceptions do
        printfn $"{e.GetType().Name}: {e.Message}"
printf $"Task t Status: {t.Status}"
if t.Status = TaskStatus.RanToCompletion then
    printf $", Result: {t.Result}"
source.Dispose()
// The example displays output like the following:
//       TaskCanceledException: A task was canceled.
//       Task t Status: Canceled
Imports System.Threading
Imports System.Threading.Tasks
Module Example
   Public Sub Main()
      Dim source As New CancellationTokenSource()
      
      Dim t = Task.Run(Async Function()
                                Await Task.Delay(TimeSpan.FromSeconds(1.5),
                                                 source.Token)
                                Return 42
                       End Function)
      source.Cancel()
      Try
         t.Wait()
      Catch ae As AggregateException
         For Each e In ae.InnerExceptions
            Console.WriteLine("{0}: {1}", e.GetType().Name, e.Message)
         Next
      End Try
      Console.Write("Task t Status: {0}", t.Status)
      If t.Status = TaskStatus.RanToCompletion Then
         Console.Write(", Result: {0}", t.Result)
      End If
      source.Dispose()
   End Sub
End Module
' The example displays output like the following:
'       TaskCanceledException: A task was canceled.
'       Task t Status: Canceled
请注意,此示例包含潜在的争用条件:它取决于在取消令牌时异步执行延迟的任务。 尽管从调用到 Delay(TimeSpan, CancellationToken) 方法的 1.5 秒延迟可能会做出这种假设,但是,在取消令牌之前,对 Delay(TimeSpan, CancellationToken) 方法的调用可能会返回。 在这种情况下,该示例生成以下输出:
Task t Status: RanToCompletion, Result: 42
注解
如果在指定的时间延迟之前发出取消令牌的信号,则 TaskCanceledException 异常结果,并且任务在 Canceled 状态下完成。 否则,任务在指定的时间延迟过后处于 RanToCompletion 状态完成。
有关使用方案和其他示例,请参阅 Delay(Int32) 重载的文档。
此方法取决于系统时钟。 这意味着,如果 delay 参数小于系统时钟的分辨率,则时间延迟大约等于系统时钟的分辨率,而 Windows 系统上的分辨率约为 15 毫秒。
注意
所使用的系统时钟与 GetTickCount使用的时钟相同,这不受 timeBeginPeriod 和 timeEndPeriod所做的更改的影响。
适用于
Delay(TimeSpan, TimeProvider)
- Source:
- Task.cs
- Source:
- Task.cs
创建在指定时间间隔后完成的任务。
public:
 static System::Threading::Tasks::Task ^ Delay(TimeSpan delay, TimeProvider ^ timeProvider);public static System.Threading.Tasks.Task Delay (TimeSpan delay, TimeProvider timeProvider);static member Delay : TimeSpan * TimeProvider -> System.Threading.Tasks.TaskPublic Shared Function Delay (delay As TimeSpan, timeProvider As TimeProvider) As Task参数
- delay
- TimeSpan
完成返回的任务之前要等待的 TimeSpan,或 InfiniteTimeSpan 无限期等待。
- timeProvider
- TimeProvider
要解释 delay的 TimeProvider。
返回
表示时间延迟的任务。
例外
              timeProvider 参数 null。
适用于
Delay(TimeSpan, TimeProvider, CancellationToken)
- Source:
- Task.cs
- Source:
- Task.cs
创建在指定时间间隔后完成的可取消任务。
public:
 static System::Threading::Tasks::Task ^ Delay(TimeSpan delay, TimeProvider ^ timeProvider, System::Threading::CancellationToken cancellationToken);public static System.Threading.Tasks.Task Delay (TimeSpan delay, TimeProvider timeProvider, System.Threading.CancellationToken cancellationToken);static member Delay : TimeSpan * TimeProvider * System.Threading.CancellationToken -> System.Threading.Tasks.TaskPublic Shared Function Delay (delay As TimeSpan, timeProvider As TimeProvider, cancellationToken As CancellationToken) As Task参数
- delay
- TimeSpan
完成返回的任务之前要等待的 TimeSpan,或 InfiniteTimeSpan 无限期等待。
- timeProvider
- TimeProvider
要解释 delay的 TimeProvider。
- cancellationToken
- CancellationToken
等待任务完成时要观察的取消令牌。
返回
表示时间延迟的任务。
例外
              timeProvider 参数 null。
取消令牌已取消。 此异常存储在返回的任务中。