Export (0) Print
Expand All

Task.Delay Method (TimeSpan, CancellationToken)

.NET Framework 4.6 and 4.5

Creates a cancellable task that completes after a specified time interval.

Namespace:  System.Threading.Tasks
Assemblies:   System.Threading.Tasks (in System.Threading.Tasks.dll)
  mscorlib (in mscorlib.dll)

public static Task Delay(
	TimeSpan delay,
	CancellationToken cancellationToken
)

Parameters

delay
Type: System.TimeSpan

The time span to wait before completing the returned task, or TimeSpan.FromMilliseconds(-1) to wait indefinitely.

cancellationToken
Type: System.Threading.CancellationToken

The cancellation token that will be checked prior to completing the returned task.

Return Value

Type: System.Threading.Tasks.Task
A task that represents the time delay.

ExceptionCondition
ArgumentOutOfRangeException

delay represents a negative time interval other than TimeSpan.FromMillseconds(-1).

-or-

The delay argument's TotalMilliseconds property is greater than Int32.MaxValue.

TaskCanceledException

The task has been canceled.

ObjectDisposedException

The provided cancellationToken has already been disposed.

If the cancellation token is signaled before the specified time delay, a TaskCanceledException exception results, and the task is completed in the TaskStatus.Canceled state. Otherwise, the task is completed in the TaskStatus.RanToCompletion state once the specified time delay has elapsed.

For usage scenarios and additional examples, see the documentation for the Delay(Int32) overload.

This method depends on the system clock. This means that the time delay will approximately equal the resolution of the system clock if the delay argument is less than the resolution of the system clock, which is approximately 15 milliseconds on Windows systems.

The following example launches a task that includes a call to the Delay(TimeSpan, CancellationToken) method with a one-and-a-half second delay. Before the delay interval elapses, the token is cancelled. The output from the example shows that, as a result, a TaskCanceledException is thrown, and the tasks' Status property is set to TaskStatus.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

Note that this example includes a potential race condition: it depends on the task asynchronously executing the delay when the token is cancelled. Although the 1.5 second delay from the call to the Delay(TimeSpan, CancellationToken) method makes that assumption likely, it is nevertheless possible that the call to the Delay(TimeSpan, CancellationToken) method could return before the token is cancelled. In that case, the example produces the following output:

Task t Status: RanToCompletion, Result: 42

.NET Framework

Supported in: 4.6, 4.5

Supported in: Windows Phone 8.1

Supported in: Windows Phone Silverlight 8.1

Supported in: Windows Phone Silverlight 8
Show:
© 2015 Microsoft