Task.Delay Metodo

Definizione

Crea un'attività che verrà completata dopo un ritardo di tempo.

Overload

Delay(TimeSpan, TimeProvider, CancellationToken)

Crea un'attività annullabile che viene completata dopo un intervallo di tempo specificato.

Delay(TimeSpan, CancellationToken)

Crea un'attività annullabile che viene completata dopo un intervallo di tempo specificato.

Delay(TimeSpan, TimeProvider)

Crea un'attività che viene completata dopo un intervallo di tempo specificato.

Delay(TimeSpan)

Crea un'attività che viene completata dopo un intervallo di tempo specificato.

Delay(Int32)

Crea un'attività che viene completata dopo un numero di millisecondi specificato.

Delay(Int32, CancellationToken)

Crea un'attività annullabile che viene completata dopo un numero di millisecondi specificato.

Delay(TimeSpan, TimeProvider, CancellationToken)

Crea un'attività annullabile che viene completata dopo un intervallo di tempo specificato.

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

Parametri

delay
TimeSpan

Oggetto TimeSpan da attendere prima di completare l'attività restituita o InfiniteTimeSpan attendere in modo indefinito.

timeProvider
TimeProvider

Oggetto TimeProvider con cui interpretare delay.

cancellationToken
CancellationToken

Token di annullamento da osservare durante l'attesa del completamento dell'attività.

Restituisce

Attività che rappresenta il ritardo di tempo.

Eccezioni

delay rappresenta un intervallo di tempo negativo diverso da InfiniteTimeSpan.

-oppure-

delayLa proprietà è TotalMilliseconds maggiore di 4294967294.

Il valore dell'argomento timeProvider è null.

Il token di annullamento è stato annullato. Questa eccezione viene archiviata nell'attività restituita.

Si applica a

Delay(TimeSpan, CancellationToken)

Crea un'attività annullabile che viene completata dopo un intervallo di tempo specificato.

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

Parametri

delay
TimeSpan

Intervallo di tempo da attendere prima del completamento dell'attività restituita oppure Timeout.InfiniteTimeSpan per un'attesa indefinita.

cancellationToken
CancellationToken

Token di annullamento da osservare durante l'attesa del completamento dell'attività.

Restituisce

Attività che rappresenta il ritardo di tempo.

Eccezioni

delay rappresenta un intervallo di tempo negativo diverso da Timeout.InfiniteTimeSpan.

-oppure-

La delay proprietà dell'argomento TotalMilliseconds è maggiore di 4294967294 in .NET 6 e versioni successive o Int32.MaxValue in tutte le versioni precedenti.

L'attività è stata annullata.

Provider cancellationToken già eliminato.

Esempio

Nell'esempio seguente viene avviata un'attività Delay(TimeSpan, CancellationToken) che include una chiamata al metodo con un ritardo di 1,5 secondi. Prima della scadenza dell'intervallo di ritardo, il token viene annullato. L'output dell'esempio mostra che, di conseguenza, viene generata una TaskCanceledException classe e la proprietà delle Status attività è impostata su 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

Si noti che questo esempio include una condizione di gara potenziale: dipende dall'attività che esegue in modo asincrono il ritardo quando il token viene annullato. Anche se il ritardo 1,5 secondo dalla chiamata al Delay(TimeSpan, CancellationToken) metodo rende probabile che tale presupposto sia possibile, è tuttavia possibile che la chiamata al Delay(TimeSpan, CancellationToken) metodo possa restituire prima che il token venga annullato. In questo caso, l'esempio produce l'output seguente:

Task t Status: RanToCompletion, Result: 42

Commenti

Se il token di annullamento viene segnalato prima del ritardo di tempo specificato, un'eccezione TaskCanceledException restituisce i risultati e l'attività viene completata nello Canceled stato. In caso contrario, l'attività viene completata nello RanToCompletion stato una volta trascorso il ritardo di tempo specificato.

Per scenari di utilizzo e esempi aggiuntivi, vedere la documentazione per l'overload Delay(Int32) .

Questo metodo dipende dall'orologio di sistema. Ciò significa che il ritardo di tempo equivale approssimativamente alla risoluzione dell'orologio di sistema se l'argomento delay è minore della risoluzione dell'orologio di sistema, ovvero circa 15 millisecondi nei sistemi Windows.

Nota

L'orologio di sistema usato è lo stesso orologio usato da GetTickCount, che non è interessato dalle modifiche apportate con timeBeginPeriod e timeEndPeriod.

Si applica a

Delay(TimeSpan, TimeProvider)

Crea un'attività che viene completata dopo un intervallo di tempo specificato.

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

Parametri

delay
TimeSpan

Oggetto TimeSpan da attendere prima di completare l'attività restituita o InfiniteTimeSpan attendere in modo indefinito.

timeProvider
TimeProvider

Oggetto TimeProvider con cui interpretare delay.

Restituisce

Attività che rappresenta il ritardo di tempo.

Eccezioni

delay rappresenta un intervallo di tempo negativo diverso da InfiniteTimeSpan.

-oppure-

delayLa proprietà è TotalMilliseconds maggiore di 4294967294.

Il valore dell'argomento timeProvider è null.

Si applica a

Delay(TimeSpan)

Crea un'attività che viene completata dopo un intervallo di tempo specificato.

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

Parametri

delay
TimeSpan

Intervallo di tempo da attendere prima del completamento dell'attività restituita oppure Timeout.InfiniteTimeSpan per un'attesa indefinita.

Restituisce

Attività che rappresenta il ritardo di tempo.

Eccezioni

delay rappresenta un intervallo di tempo negativo diverso da Timeout.InfiniteTimeSpan.

-oppure-

La delay proprietà dell'argomento TotalMilliseconds è maggiore di 4294967294 in .NET 6 e versioni successive o Int32.MaxValue in tutte le versioni precedenti.

Esempio

Nell'esempio seguente viene illustrato un semplice uso del Delay metodo.

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

Commenti

Dopo il ritardo di tempo specificato, l'attività viene completata nello RanToCompletion stato.

Per scenari di utilizzo e esempi aggiuntivi, vedere la documentazione per l'overload Delay(Int32) .

Questo metodo dipende dall'orologio di sistema. Ciò significa che il ritardo di tempo equivale approssimativamente alla risoluzione dell'orologio di sistema se l'argomento delay è minore della risoluzione dell'orologio di sistema, ovvero circa 15 millisecondi nei sistemi Windows.

Nota

L'orologio di sistema usato è lo stesso orologio usato da GetTickCount, che non è interessato dalle modifiche apportate con timeBeginPeriod e timeEndPeriod.

Si applica a

Delay(Int32)

Crea un'attività che viene completata dopo un numero di millisecondi specificato.

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

Parametri

millisecondsDelay
Int32

Numero di millisecondi prima del completamento dell'attività restituita oppure -1 per un'attesa indefinita.

Restituisce

Attività che rappresenta il ritardo di tempo.

Eccezioni

L'argomento millisecondsDelay è minore di -1.

Esempio

Nell'esempio seguente viene illustrato un semplice uso del Delay metodo.

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

Commenti

Il Delay metodo viene in genere usato per ritardare l'operazione di tutto o parte di un'attività per un intervallo di tempo specificato. Più comunemente, il ritardo del tempo viene introdotto:

  • All'inizio dell'attività, come illustrato nell'esempio seguente.

    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
    
  • Alcuni minuti durante l'esecuzione dell'attività. In questo caso, la chiamata al Delay metodo viene eseguita come attività figlio all'interno di un'attività, come illustrato nell'esempio seguente. Si noti che poiché l'attività che chiama il Delay metodo viene eseguita in modo asincrono, l'attività padre deve attendere che venga completata usando la await parola chiave.

    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
    

Dopo il ritardo di tempo specificato, l'attività viene completata nello RanToCompletion stato.

Questo metodo dipende dall'orologio di sistema. Ciò significa che il ritardo di tempo equivale approssimativamente alla risoluzione dell'orologio di sistema se l'argomento millisecondsDelay è minore della risoluzione dell'orologio di sistema, ovvero circa 15 millisecondi nei sistemi Windows.

Nota

L'orologio di sistema usato è lo stesso orologio usato da GetTickCount, che non è interessato dalle modifiche apportate con timeBeginPeriod e timeEndPeriod.

Si applica a

Delay(Int32, CancellationToken)

Crea un'attività annullabile che viene completata dopo un numero di millisecondi specificato.

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

Parametri

millisecondsDelay
Int32

Numero di millisecondi prima del completamento dell'attività restituita oppure -1 per un'attesa indefinita.

cancellationToken
CancellationToken

Token di annullamento da osservare durante l'attesa del completamento dell'attività.

Restituisce

Attività che rappresenta il ritardo di tempo.

Eccezioni

L'argomento millisecondsDelay è minore di -1.

L'attività è stata annullata.

Provider cancellationToken già eliminato.

Esempio

Nell'esempio seguente viene avviata un'attività che include una chiamata al Delay(Int32, CancellationToken) metodo con un secondo ritardo. Prima della scadenza dell'intervallo di ritardo, il token viene annullato. L'output dell'esempio mostra che, di conseguenza, viene generata una TaskCanceledException classe e la proprietà delle Status attività è impostata su 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

Commenti

Se il token di annullamento viene segnalato prima del ritardo di tempo specificato, un'eccezione TaskCanceledException restituisce i risultati e l'attività viene completata nello Canceled stato. In caso contrario, l'attività viene completata nello RanToCompletion stato una volta trascorso il ritardo di tempo specificato.

Per scenari di utilizzo e esempi aggiuntivi, vedere la documentazione per l'overload Delay(Int32) .

Questo metodo dipende dall'orologio di sistema. Ciò significa che il ritardo di tempo equivale approssimativamente alla risoluzione dell'orologio di sistema se l'argomento millisecondsDelay è minore della risoluzione dell'orologio di sistema, ovvero circa 15 millisecondi nei sistemi Windows.

Nota

L'orologio di sistema usato è lo stesso orologio usato da GetTickCount, che non è interessato dalle modifiche apportate con timeBeginPeriod e timeEndPeriod.

Si applica a