Task.Delay Método

Definición

Crea una tarea que se completará después de un retraso.

Sobrecargas

Delay(TimeSpan, TimeProvider, CancellationToken)

Crea una tarea cancelable que se completa después de un intervalo de tiempo específico.

Delay(TimeSpan, CancellationToken)

Crea una tarea cancelable que se completa después de un intervalo de tiempo específico.

Delay(TimeSpan, TimeProvider)

Crea una tarea que se completa después de un intervalo de tiempo especificado.

Delay(TimeSpan)

Crea una tarea que se completa después de un intervalo de tiempo especificado.

Delay(Int32)

Crea una tarea que se completa después de un número especificado de milisegundos.

Delay(Int32, CancellationToken)

Crea una tarea cancelable que se completa después de un número especificado de milisegundos.

Delay(TimeSpan, TimeProvider, CancellationToken)

Source:
Task.cs
Source:
Task.cs

Crea una tarea cancelable que se completa después de un intervalo de tiempo específico.

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

Parámetros

delay
TimeSpan

que TimeSpan se debe esperar antes de completar la tarea devuelta o InfiniteTimeSpan esperar indefinidamente.

timeProvider
TimeProvider

TimeProvider con el que se va a interpretar delay.

cancellationToken
CancellationToken

Un token de cancelación que se observará mientras se espera a que se complete la tarea.

Devoluciones

Una tarea que representa el retraso.

Excepciones

delay representa un intervalo de tiempo negativo distinto de InfiniteTimeSpan.

O bien

delayLa propiedad de es TotalMilliseconds mayor que 4294967294.

El argumento timeProvider es null.

Se canceló el token de cancelación. Esta excepción se almacena en la tarea devuelta.

Se aplica a

Delay(TimeSpan, CancellationToken)

Source:
Task.cs
Source:
Task.cs
Source:
Task.cs

Crea una tarea cancelable que se completa después de un intervalo de tiempo específico.

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

Parámetros

delay
TimeSpan

El intervalo de tiempo que espera antes de completar la tarea devuelta o Timeout.InfiniteTimeSpan para esperar indefinidamente.

cancellationToken
CancellationToken

Un token de cancelación que se observará mientras se espera a que se complete la tarea.

Devoluciones

Una tarea que representa el retraso.

Excepciones

delay representa un intervalo de tiempo negativo distinto de Timeout.InfiniteTimeSpan.

O bien

La delay propiedad del TotalMilliseconds argumento es mayor que 4294967294 en .NET 6 y versiones posteriores, o Int32.MaxValue en todas las versiones anteriores.

La tarea se canceló. Esta excepción se almacena en la tarea devuelta.

Ya se eliminó el cancellationToken proporcionado.

Ejemplos

En el ejemplo siguiente se inicia una tarea que incluye una llamada al Delay(TimeSpan, CancellationToken) método con un retraso de 1,5 segundos. Antes de que transcurre el intervalo de retraso, se cancela el token. La salida del ejemplo muestra que, como resultado, se produce una TaskCanceledException excepción y la propiedad de Status las tareas se establece Canceleden .

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

Tenga en cuenta que en este ejemplo se incluye una posible condición de carrera: depende de la tarea que ejecute de forma asincrónica el retraso cuando se cancele el token. Aunque el retraso de 1,5 segundos de la llamada al Delay(TimeSpan, CancellationToken) método hace probable esa suposición, es posible que la llamada al Delay(TimeSpan, CancellationToken) método pueda devolverse antes de que se cancele el token. En ese caso, el ejemplo genera la siguiente salida:

Task t Status: RanToCompletion, Result: 42

Comentarios

Si el token de cancelación se señala antes del retraso de tiempo especificado, se produce una TaskCanceledException excepción y la tarea se completa en el Canceled estado . De lo contrario, la tarea se completa en el RanToCompletion estado una vez transcurrido el retraso de tiempo especificado.

Para ver escenarios de uso y ejemplos adicionales, consulte la documentación de la Delay(Int32) sobrecarga.

Este método depende del reloj del sistema. Esto significa que el retraso de tiempo equivale aproximadamente a la resolución del reloj del sistema si el delay argumento es menor que la resolución del reloj del sistema, que es aproximadamente de 15 milisegundos en sistemas Windows.

Nota

El reloj del sistema que se usa es el mismo reloj utilizado por GetTickCount, que no se ve afectado por los cambios realizados con timeBeginPeriod y timeEndPeriod.

Se aplica a

Delay(TimeSpan, TimeProvider)

Source:
Task.cs
Source:
Task.cs

Crea una tarea que se completa después de un intervalo de tiempo especificado.

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

Parámetros

delay
TimeSpan

que TimeSpan se debe esperar antes de completar la tarea devuelta o InfiniteTimeSpan esperar indefinidamente.

timeProvider
TimeProvider

TimeProvider con el que se va a interpretar delay.

Devoluciones

Una tarea que representa el retraso.

Excepciones

delay representa un intervalo de tiempo negativo distinto de InfiniteTimeSpan.

O bien

delayLa propiedad de es TotalMilliseconds mayor que 4294967294.

El argumento timeProvider es null.

Se aplica a

Delay(TimeSpan)

Source:
Task.cs
Source:
Task.cs
Source:
Task.cs

Crea una tarea que se completa después de un intervalo de tiempo especificado.

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

Parámetros

delay
TimeSpan

El intervalo de tiempo que espera antes de completar la tarea devuelta o Timeout.InfiniteTimeSpan para esperar indefinidamente.

Devoluciones

Una tarea que representa el retraso.

Excepciones

delay representa un intervalo de tiempo negativo distinto de Timeout.InfiniteTimeSpan.

O bien

La delay propiedad del TotalMilliseconds argumento es mayor que 4294967294 en .NET 6 y versiones posteriores, o Int32.MaxValue en todas las versiones anteriores.

Ejemplos

En el ejemplo siguiente se muestra un uso sencillo del Delay método .

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

Comentarios

Después del retraso de tiempo especificado, la tarea se completa en RanToCompletion estado.

Para ver escenarios de uso y ejemplos adicionales, consulte la documentación de la Delay(Int32) sobrecarga.

Este método depende del reloj del sistema. Esto significa que el retraso de tiempo equivale aproximadamente a la resolución del reloj del sistema si el delay argumento es menor que la resolución del reloj del sistema, que es aproximadamente de 15 milisegundos en sistemas Windows.

Nota

El reloj del sistema que se usa es el mismo reloj utilizado por GetTickCount, que no se ve afectado por los cambios realizados con timeBeginPeriod y timeEndPeriod.

Se aplica a

Delay(Int32)

Source:
Task.cs
Source:
Task.cs
Source:
Task.cs

Crea una tarea que se completa después de un número especificado de milisegundos.

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

Parámetros

millisecondsDelay
Int32

El número de milisegundos que se esperará antes de completar la tarea devuelta o -1 para esperar indefinidamente.

Devoluciones

Una tarea que representa el retraso.

Excepciones

El argumento millisecondsDelay es menor que -1.

Ejemplos

En el ejemplo siguiente se muestra un uso sencillo del Delay método .

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

Comentarios

El Delay método se usa normalmente para retrasar la operación de toda o parte de una tarea durante un intervalo de tiempo especificado. Normalmente, se introduce el retraso de tiempo:

  • Al principio de la tarea, como se muestra en el ejemplo siguiente.

    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
    
  • En algún momento mientras se ejecuta la tarea. En este caso, la llamada al Delay método se ejecuta como una tarea secundaria dentro de una tarea, como se muestra en el ejemplo siguiente. Tenga en cuenta que, dado que la tarea que llama al Delay método se ejecuta de forma asincrónica, la tarea primaria debe esperar a que se complete mediante la await palabra clave .

    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
    

Después del retraso de tiempo especificado, la tarea se completa en el RanToCompletion estado .

Este método depende del reloj del sistema. Esto significa que el retraso de tiempo equivale aproximadamente a la resolución del reloj del sistema si el millisecondsDelay argumento es menor que la resolución del reloj del sistema, que es aproximadamente de 15 milisegundos en sistemas Windows.

Nota

El reloj del sistema que se usa es el mismo reloj utilizado por GetTickCount, que no se ve afectado por los cambios realizados con timeBeginPeriod y timeEndPeriod.

Se aplica a

Delay(Int32, CancellationToken)

Source:
Task.cs
Source:
Task.cs
Source:
Task.cs

Crea una tarea cancelable que se completa después de un número especificado de milisegundos.

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

Parámetros

millisecondsDelay
Int32

El número de milisegundos que se esperará antes de completar la tarea devuelta o -1 para esperar indefinidamente.

cancellationToken
CancellationToken

Un token de cancelación que se observará mientras se espera a que se complete la tarea.

Devoluciones

Una tarea que representa el retraso.

Excepciones

El argumento millisecondsDelay es menor que -1.

La tarea se canceló. Esta excepción se almacena en la tarea devuelta.

Ya se eliminó el cancellationToken proporcionado.

Ejemplos

En el ejemplo siguiente se inicia una tarea que incluye una llamada al Delay(Int32, CancellationToken) método con un retraso de un segundo. Antes de que transcurre el intervalo de retraso, se cancela el token. La salida del ejemplo muestra que, como resultado, se produce una TaskCanceledException excepción y la propiedad de Status las tareas se establece Canceleden .

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

Comentarios

Si el token de cancelación se señala antes del retraso de tiempo especificado, se produce una TaskCanceledException excepción y la tarea se completa en el Canceled estado . De lo contrario, la tarea se completa en el RanToCompletion estado una vez transcurrido el retraso de tiempo especificado.

Para ver escenarios de uso y ejemplos adicionales, consulte la documentación de la Delay(Int32) sobrecarga.

Este método depende del reloj del sistema. Esto significa que el retraso de tiempo equivale aproximadamente a la resolución del reloj del sistema si el millisecondsDelay argumento es menor que la resolución del reloj del sistema, que es aproximadamente de 15 milisegundos en sistemas Windows.

Nota

El reloj del sistema que se usa es el mismo reloj utilizado por GetTickCount, que no se ve afectado por los cambios realizados con timeBeginPeriod y timeEndPeriod.

Se aplica a