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()
t.Wait()
Catch ae As AggregateException
For Each e In ae.InnerExceptions
Console.WriteLine("{0}: {1}", e.GetType().Name, e.Message)
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
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
Remarks
If the cancellation token is signaled before the specified time delay, a TaskCanceledException exception results, and the task is completed in the Canceled state. Otherwise, the task is completed in the 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 system clock that is used is the same clock used by GetTickCount, which is not affected by changes made with timeBeginPeriod and timeEndPeriod.
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.Task
Public Shared Function Delay (delay As TimeSpan, timeProvider As TimeProvider) As Task
Parameters
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
Parameters
The time span to wait before completing the returned task, or Timeout.InfiniteTimeSpan
to wait indefinitely.
Returns
ArgumentOutOfRangeException
delay
represents a negative time interval other than Timeout.InfiniteTimeSpan
.
The delay
argument's TotalMilliseconds property is greater than 4294967294 on .NET 6 and later versions, or Int32.MaxValue on all previous versions.
Examples
The following example shows a simple use of the Delay method.
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
Remarks
After the specified time delay, the task is completed in RanToCompletion state.
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 system clock that is used is the same clock used by GetTickCount, which is not affected by changes made with timeBeginPeriod and timeEndPeriod.
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
Parameters
The number of milliseconds to wait before completing the returned task, or -1 to wait indefinitely.
Returns
// 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
Remarks
The Delay method is typically used to delay the operation of all or part of a task for a specified time interval. Most commonly, the time delay is introduced:
At the beginning of the task, as the following example shows.
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 =
.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
Sometime while the task is executing. In this case, the call to the Delay method executes as a child task within a task, as the following example shows. Note that since the task that calls the Delay method executes asynchronously, the parent task must wait for it to complete by using the await
keyword.
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
After the specified time delay, the task is completed in the RanToCompletion state.
This method depends on the system clock. This means that the time delay will approximately equal the resolution of the system clock if the millisecondsDelay
argument is less than the resolution of the system clock, which is approximately 15 milliseconds on Windows systems.
The system clock that is used is the same clock used by GetTickCount, which is not affected by changes made with timeBeginPeriod and timeEndPeriod.
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
Parameters
Examples
The following example launches a task that includes a call to the Delay(Int32, CancellationToken) method with a one 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 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()
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()
t.Wait()
Catch ae As AggregateException
For Each e In ae.InnerExceptions
Console.WriteLine("{0}: {1}", e.GetType().Name, e.Message)
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
Remarks
If the cancellation token is signaled before the specified time delay, a TaskCanceledException exception results, and the task is completed in the Canceled state. Otherwise, the task is completed in the 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 millisecondsDelay
argument is less than the resolution of the system clock, which is approximately 15 milliseconds on Windows systems.
The system clock that is used is the same clock used by GetTickCount, which is not affected by changes made with timeBeginPeriod and timeEndPeriod.
Coming soon: Throughout 2024 we will be phasing out GitHub Issues as the feedback mechanism for content and replacing it with a new feedback system. For more information see: https://aka.ms/ContentUserFeedback.
Submit and view feedback for
This product