Task.Delay Metoda

Definice

Vytvoří úkol, který se dokončí po časovém zpoždění.

Přetížení

Delay(TimeSpan, TimeProvider, CancellationToken)

Vytvoří zrušitelný úkol, který se dokončí po zadaném časovém intervalu.

Delay(TimeSpan, CancellationToken)

Vytvoří zrušitelný úkol, který se dokončí po zadaném časovém intervalu.

Delay(TimeSpan, TimeProvider)

Vytvoří úlohu, která se dokončí po zadaném časovém intervalu.

Delay(TimeSpan)

Vytvoří úlohu, která se dokončí po zadaném časovém intervalu.

Delay(Int32)

Vytvoří úlohu, která se dokončí po zadaném počtu milisekund.

Delay(Int32, CancellationToken)

Vytvoří zrušitelný úkol, který se dokončí po zadaném počtu milisekund.

Delay(TimeSpan, TimeProvider, CancellationToken)

Source:
Task.cs
Source:
Task.cs

Vytvoří zrušitelný úkol, který se dokončí po zadaném časovém intervalu.

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

Parametry

delay
TimeSpan

Chcete-li TimeSpan počkat před dokončením vrácené úlohy, nebo InfiniteTimeSpan čekat neomezeně dlouho.

timeProvider
TimeProvider

Hodnota TimeProvider , pomocí které se má interpretovat delay.

cancellationToken
CancellationToken

Token zrušení, který se má sledovat při čekání na dokončení úlohy.

Návraty

Úkol, který představuje časové zpoždění.

Výjimky

delay představuje jiný záporný časový interval než InfiniteTimeSpan.

-nebo-

delayVlastnost je TotalMilliseconds větší než 4294967294.

Argument timeProvider je null.

Token zrušení byl zrušen. Tato výjimka se uloží do vrácené úlohy.

Platí pro

Delay(TimeSpan, CancellationToken)

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

Vytvoří zrušitelný úkol, který se dokončí po zadaném časovém intervalu.

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

Parametry

delay
TimeSpan

Časový rozsah čekání před dokončením vrácené úlohy nebo Timeout.InfiniteTimeSpan čekání na neomezenou dobu.

cancellationToken
CancellationToken

Token zrušení, který se má sledovat při čekání na dokončení úlohy.

Návraty

Úkol, který představuje časové zpoždění.

Výjimky

delay představuje jiný záporný časový interval než Timeout.InfiniteTimeSpan.

-nebo-

Vlastnost delay argumentu TotalMilliseconds je větší než 4294967294 v rozhraní .NET 6 a novějších verzích nebo Int32.MaxValue ve všech předchozích verzích.

Úkol byl zrušen. Tato výjimka se uloží do vrácené úlohy.

Poskytnutý soubor cancellationToken již byl odstraněn.

Příklady

Následující příklad spustí úlohu, která obsahuje volání Delay(TimeSpan, CancellationToken) metody se zpožděním 1,5 sekundy. Před uplynutím intervalu zpoždění se token zruší. Výstup z příkladu ukazuje, že se v důsledku toho TaskCanceledException vyvolá objekt a vlastnost tasks je Status nastavená na Canceledhodnotu .

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

Všimněte si, že tento příklad zahrnuje potenciální konflikt časování: závisí na úkolu, který asynchronně spustí zpoždění při zrušení tokenu. Ačkoli zpoždění 1,5 sekundy od volání Delay(TimeSpan, CancellationToken) metody činí tento předpoklad pravděpodobný, je však možné, že volání Delay(TimeSpan, CancellationToken) metody může vrátit před zrušením tokenu. V takovém případě tento příklad vytvoří následující výstup:

Task t Status: RanToCompletion, Result: 42

Poznámky

Pokud se token zrušení signalizoval před určeným časovým zpožděním, dojde k výjimce TaskCanceledException a úloha se dokončí ve Canceled stavu . V opačném případě je úkol dokončen ve RanToCompletion stavu po uplynutí zadaného časového zpoždění.

Scénáře použití a další příklady najdete v dokumentaci k Delay(Int32) přetížení.

Tato metoda závisí na systémových hodinách. To znamená, že časové zpoždění bude přibližně odpovídat rozlišení systémových hodin, pokud delay je argument menší než rozlišení systémových hodin, což je v systémech Windows přibližně 15 milisekund.

Poznámka

Systémové hodiny, které se používají, jsou stejné hodiny jako GetTickCount, které nejsou ovlivněny změnami timeBeginPeriod a timeEndPeriod.

Platí pro

Delay(TimeSpan, TimeProvider)

Source:
Task.cs
Source:
Task.cs

Vytvoří úlohu, která se dokončí po zadaném časovém intervalu.

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

Parametry

delay
TimeSpan

Chcete-li TimeSpan počkat před dokončením vrácené úlohy, nebo InfiniteTimeSpan čekat neomezeně dlouho.

timeProvider
TimeProvider

Hodnota TimeProvider , pomocí které se má interpretovat delay.

Návraty

Úkol, který představuje časové zpoždění.

Výjimky

delay představuje jiný záporný časový interval než InfiniteTimeSpan.

-nebo-

delayVlastnost je TotalMilliseconds větší než 4294967294.

Argument timeProvider je null.

Platí pro

Delay(TimeSpan)

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

Vytvoří úlohu, která se dokončí po zadaném časovém intervalu.

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

Parametry

delay
TimeSpan

Časový rozsah čekání před dokončením vrácené úlohy nebo Timeout.InfiniteTimeSpan čekání na neomezenou dobu.

Návraty

Úkol, který představuje časové zpoždění.

Výjimky

delay představuje jiný záporný časový interval než Timeout.InfiniteTimeSpan.

-nebo-

Vlastnost delay argumentu TotalMilliseconds je větší než 4294967294 v rozhraní .NET 6 a novějších verzích nebo Int32.MaxValue ve všech předchozích verzích.

Příklady

Následující příklad ukazuje jednoduché použití Delay metody .

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

Poznámky

Po uplynutí zadaného časového zpoždění je úkol dokončen ve RanToCompletion stavu .

Scénáře použití a další příklady najdete v dokumentaci k Delay(Int32) přetížení.

Tato metoda závisí na systémových hodinách. To znamená, že časové zpoždění bude přibližně odpovídat rozlišení systémových hodin, pokud delay je argument menší než rozlišení systémových hodin, což je v systémech Windows přibližně 15 milisekund.

Poznámka

Systémové hodiny, které se používají, jsou stejné hodiny jako GetTickCount, které nejsou ovlivněny změnami timeBeginPeriod a timeEndPeriod.

Platí pro

Delay(Int32)

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

Vytvoří úlohu, která se dokončí po zadaném počtu milisekund.

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

Parametry

millisecondsDelay
Int32

Počet milisekund, které se mají čekat před dokončením vrácené úlohy, nebo -1 pro čekání na neomezenou dobu.

Návraty

Úkol, který představuje časové zpoždění.

Výjimky

Argument millisecondsDelay je menší než -1.

Příklady

Následující příklad ukazuje jednoduché použití Delay metody .

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

Poznámky

Metoda se Delay obvykle používá ke zpoždění operace celé úlohy nebo její části o zadaný časový interval. Nejčastěji se časové zpoždění zavádí:

  • Na začátku úlohy, jak ukazuje následující příklad.

    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
    
  • Někdy během provádění úlohy. V tomto případě se Delay volání metody provede jako podřízená úloha v rámci úlohy, jak ukazuje následující příklad. Všimněte si, že vzhledem k tomu, že úloha, která volá metodu Delay , provádí asynchronně, musí nadřazená úloha čekat na dokončení pomocí klíčového await slova .

    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
    

Po uplynutí zadaného časového zpoždění se úkol dokončí ve RanToCompletion stavu .

Tato metoda závisí na systémových hodinách. To znamená, že časové zpoždění bude přibližně odpovídat rozlišení systémových hodin, pokud millisecondsDelay je argument menší než rozlišení systémových hodin, což je v systémech Windows přibližně 15 milisekund.

Poznámka

Systémové hodiny, které se používají, jsou stejné hodiny jako GetTickCount, které nejsou ovlivněny změnami timeBeginPeriod a timeEndPeriod.

Platí pro

Delay(Int32, CancellationToken)

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

Vytvoří zrušitelný úkol, který se dokončí po zadaném počtu milisekund.

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

Parametry

millisecondsDelay
Int32

Počet milisekund, které se mají čekat před dokončením vrácené úlohy, nebo -1 pro čekání na neomezenou dobu.

cancellationToken
CancellationToken

Token zrušení, který se má sledovat při čekání na dokončení úlohy.

Návraty

Úkol, který představuje časové zpoždění.

Výjimky

Argument millisecondsDelay je menší než -1.

Úkol byl zrušen. Tato výjimka se uloží do vrácené úlohy.

Poskytnutý soubor cancellationToken již byl odstraněn.

Příklady

Následující příklad spustí úlohu, která obsahuje volání Delay(Int32, CancellationToken) metody s jednosekundovým zpožděním. Před uplynutím intervalu zpoždění se token zruší. Výstup z příkladu ukazuje, že se v důsledku toho TaskCanceledException vyvolá objekt a vlastnost tasks je Status nastavená na Canceledhodnotu .

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

Poznámky

Pokud se token zrušení signalizoval před určeným časovým zpožděním, dojde k výjimce TaskCanceledException a úloha se dokončí ve Canceled stavu . V opačném případě je úkol dokončen ve RanToCompletion stavu po uplynutí zadaného časového zpoždění.

Scénáře použití a další příklady najdete v dokumentaci k Delay(Int32) přetížení.

Tato metoda závisí na systémových hodinách. To znamená, že časové zpoždění se bude přibližně rovnat rozlišení systémových hodin, pokud millisecondsDelay je argument menší než rozlišení systémových hodin, což je v systémech Windows přibližně 15 milisekund.

Poznámka

Systémové hodiny, které se používají, jsou stejné jako getTickCount, které nejsou ovlivněny změnami provedenými pomocí timeBeginPeriod a timeEndPeriod.

Platí pro