Task.Delay 方法

定义

创建将在时间延迟后完成的任务。

重载

Delay(Int32)

创建一个在指定的毫秒数后完成的任务。

Delay(TimeSpan)

创建一个在指定的时间间隔后完成的任务。

Delay(Int32, CancellationToken)

创建一个在指定的毫秒数后完成的可取消任务。

Delay(TimeSpan, CancellationToken)

创建一个在指定的时间间隔后完成的可取消任务。

Delay(Int32)

创建一个在指定的毫秒数后完成的任务。

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.Task
Public Shared Function Delay (millisecondsDelay As Integer) As Task

参数

millisecondsDelay
Int32

在完成返回的任务前要等待的毫秒数;如果无限期等待,则为 -1。

返回

Task

表示时间延迟的任务。

例外

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
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
    
    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
    
    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 使用的时钟相同,这不受 timeBeginPeriodtimeEndPeriod 所做的更改的影响。

适用于

Delay(TimeSpan)

创建一个在指定的时间间隔后完成的任务。

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.Task
Public Shared Function Delay (delay As TimeSpan) As Task

参数

delay
TimeSpan

在完成返回的任务前等待的时间跨度;如果无限期等待,则为 TimeSpan.FromMilliseconds(-1)

返回

Task

表示时间延迟的任务。

例外

delay 表示除 TimeSpan.FromMilliseconds(-1) 以外的负时间间隔。

示例

下面的示例演示了该方法的 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
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 使用的时钟相同,这不受 timeBeginPeriodtimeEndPeriod 所做的更改的影响。

适用于

Delay(Int32, CancellationToken)

创建一个在指定的毫秒数后完成的可取消任务。

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.Task
Public Shared Function Delay (millisecondsDelay As Integer, cancellationToken As CancellationToken) As Task

参数

millisecondsDelay
Int32

在完成返回的任务前要等待的毫秒数;如果无限期等待,则为 -1。

cancellationToken
CancellationToken

等待任务完成期间要观察的取消标记。

返回

Task

表示时间延迟的任务。

例外

millisecondsDelay 参数小于 -1。

该任务已取消。

已释放提供的 cancellationToken

示例

以下示例启动一个任务,该任务包含对方法的调用 Delay(Int32, CancellationToken) ,延迟一秒。 在延迟间隔过前,令牌将被取消。 该示例的输出显示,因此会引发 a 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
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 使用的时钟相同,这不受 timeBeginPeriodtimeEndPeriod 所做的更改的影响。

适用于

Delay(TimeSpan, CancellationToken)

创建一个在指定的时间间隔后完成的可取消任务。

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.Task
Public Shared Function Delay (delay As TimeSpan, cancellationToken As CancellationToken) As Task

参数

delay
TimeSpan

在完成返回的任务前等待的时间跨度;如果无限期等待,则为 TimeSpan.FromMilliseconds(-1)

cancellationToken
CancellationToken

等待任务完成期间要观察的取消标记。

返回

Task

表示时间延迟的任务。

例外

delay 表示除 TimeSpan.FromMilliseconds(-1) 以外的负时间间隔。

该任务已取消。

已释放提供的 cancellationToken

示例

以下示例启动一个任务,其中包含对方法的调用 Delay(TimeSpan, CancellationToken) ,延迟为 1.5 秒。 在延迟间隔过前,令牌将被取消。 该示例的输出显示,因此会引发 a 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
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 使用的时钟相同,这不受 timeBeginPeriodtimeEndPeriod 所做的更改的影响。

适用于