Udostępnij za pośrednictwem


Task.Delay Metoda

Definicja

Tworzy zadanie, które zostanie ukończone po opóźnieniu czasu.

Przeciążenia

Delay(Int32)

Tworzy zadanie, które zostanie ukończone po określonej liczbie milisekund.

Delay(TimeSpan)

Tworzy zadanie, które zostanie ukończone po określonym interwale czasu.

Delay(Int32, CancellationToken)

Tworzy zadanie, które można anulować, które zostanie ukończone po określonej liczbie milisekund.

Delay(TimeSpan, CancellationToken)

Tworzy zadanie, które można anulować, które zostanie ukończone po określonym interwale czasu.

Delay(TimeSpan, TimeProvider)

Tworzy zadanie, które zostanie ukończone po określonym interwale czasu.

Delay(TimeSpan, TimeProvider, CancellationToken)

Tworzy zadanie, które można anulować, które zostanie ukończone po określonym interwale czasu.

Delay(Int32)

Źródło:
Task.cs
Źródło:
Task.cs
Źródło:
Task.cs

Tworzy zadanie, które zostanie ukończone po określonej liczbie 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

Liczba milisekund oczekiwania przed ukończeniem zwróconego zadania lub -1 czekać na czas nieokreślony.

Zwraca

Zadanie reprezentujące opóźnienie czasowe.

Wyjątki

Argument millisecondsDelay jest mniejszy niż -1.

Przykłady

W poniższym przykładzie przedstawiono proste użycie metody Delay.

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

Uwagi

Metoda Delay jest zwykle używana do opóźniania operacji wszystkich lub części zadania dla określonego interwału czasu. Najczęściej występuje opóźnienie czasowe:

  • Na początku zadania, jak pokazano w poniższym przykładzie.

    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
    
  • Czasami podczas wykonywania zadania. W takim przypadku wywołanie metody Delay jest wykonywane jako zadanie podrzędne w zadaniu, jak pokazano w poniższym przykładzie. Należy pamiętać, że ponieważ zadanie, które wywołuje metodę Delay, jest wykonywane asynchronicznie, zadanie nadrzędne musi czekać na ukończenie przy użyciu słowa kluczowego await.

    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 upływie określonego opóźnienia czasu zadanie zostanie ukończone w stanie RanToCompletion.

Ta metoda zależy od zegara systemowego. Oznacza to, że opóźnienie czasu będzie w przybliżeniu równe rozdzielczości zegara systemowego, jeśli argument millisecondsDelay jest mniejszy niż rozdzielczość zegara systemowego, który wynosi około 15 milisekund w systemach Windows.

Nuta

Zegar systemowy, który jest używany jest ten sam zegar używany przez GetTickCount, który nie ma wpływu na zmiany wprowadzone w timeBeginPeriod i timeEndPeriod.

Dotyczy

Delay(TimeSpan)

Źródło:
Task.cs
Źródło:
Task.cs
Źródło:
Task.cs

Tworzy zadanie, które zostanie ukończone po określonym interwale czasu.

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

Przedział czasu oczekiwania przed ukończeniem zwróconego zadania lub Timeout.InfiniteTimeSpan czekać na czas nieokreślony.

Zwraca

Zadanie reprezentujące opóźnienie czasowe.

Wyjątki

delay reprezentuje ujemny interwał czasu inny niż Timeout.InfiniteTimeSpan.

-lub-

Właściwość TotalMilliseconds argumentu delay jest większa niż 4294967294 na platformie .NET 6 lub nowszych wersjach lub Int32.MaxValue we wszystkich poprzednich wersjach.

Przykłady

W poniższym przykładzie przedstawiono proste użycie metody Delay.

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

Uwagi

Po upływie określonego opóźnienia czasu zadanie zostanie ukończone w stanie RanToCompletion.

Aby zapoznać się ze scenariuszami użycia i dodatkowymi przykładami, zobacz dokumentację przeciążenia Delay(Int32).

Ta metoda zależy od zegara systemowego. Oznacza to, że opóźnienie czasu będzie w przybliżeniu równe rozdzielczości zegara systemowego, jeśli argument delay jest mniejszy niż rozdzielczość zegara systemowego, który wynosi około 15 milisekund w systemach Windows.

Nuta

Zegar systemowy, który jest używany jest ten sam zegar używany przez GetTickCount, który nie ma wpływu na zmiany wprowadzone w timeBeginPeriod i timeEndPeriod.

Dotyczy

Delay(Int32, CancellationToken)

Źródło:
Task.cs
Źródło:
Task.cs
Źródło:
Task.cs

Tworzy zadanie, które można anulować, które zostanie ukończone po określonej liczbie 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

Liczba milisekund oczekiwania przed ukończeniem zwróconego zadania lub -1 czekać na czas nieokreślony.

cancellationToken
CancellationToken

Token anulowania do obserwowania podczas oczekiwania na ukończenie zadania.

Zwraca

Zadanie reprezentujące opóźnienie czasowe.

Wyjątki

Argument millisecondsDelay jest mniejszy niż -1.

Zadanie zostało anulowane. Ten wyjątek jest przechowywany w zwracanym zadaniu.

Podany cancellationToken został już usunięty.

Zadanie zostało anulowane.

Przykłady

Poniższy przykład uruchamia zadanie, które zawiera wywołanie metody Delay(Int32, CancellationToken) z jednosekundowym opóźnieniem. Przed upływem interwału opóźnienia token zostanie anulowany. Dane wyjściowe z przykładu pokazują, że w wyniku TaskCanceledException jest zgłaszana, a właściwość Status zadań jest ustawiona na wartość 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

Uwagi

Jeśli token anulowania zostanie zasygnalizowany przed określonym opóźnieniem czasu, wynik TaskCanceledException wyjątku i zadanie zostanie ukończone w stanie Canceled. W przeciwnym razie zadanie jest wykonywane w stanie RanToCompletion po upływie określonego czasu.

Aby zapoznać się ze scenariuszami użycia i dodatkowymi przykładami, zobacz dokumentację przeciążenia Delay(Int32).

Ta metoda zależy od zegara systemowego. Oznacza to, że opóźnienie czasu będzie w przybliżeniu równe rozdzielczości zegara systemowego, jeśli argument millisecondsDelay jest mniejszy niż rozdzielczość zegara systemowego, który wynosi około 15 milisekund w systemach Windows.

Nuta

Zegar systemowy, który jest używany jest ten sam zegar używany przez GetTickCount, który nie ma wpływu na zmiany wprowadzone w timeBeginPeriod i timeEndPeriod.

Dotyczy

Delay(TimeSpan, CancellationToken)

Źródło:
Task.cs
Źródło:
Task.cs
Źródło:
Task.cs

Tworzy zadanie, które można anulować, które zostanie ukończone po określonym interwale czasu.

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

Przedział czasu oczekiwania przed ukończeniem zwróconego zadania lub Timeout.InfiniteTimeSpan czekać na czas nieokreślony.

cancellationToken
CancellationToken

Token anulowania do obserwowania podczas oczekiwania na ukończenie zadania.

Zwraca

Zadanie reprezentujące opóźnienie czasowe.

Wyjątki

delay reprezentuje ujemny interwał czasu inny niż Timeout.InfiniteTimeSpan.

-lub-

Właściwość TotalMilliseconds argumentu delay jest większa niż 4294967294 na platformie .NET 6 lub nowszych wersjach lub Int32.MaxValue we wszystkich poprzednich wersjach.

Zadanie zostało anulowane. Ten wyjątek jest przechowywany w zwracanym zadaniu.

Podany cancellationToken został już usunięty.

Zadanie zostało anulowane.

Przykłady

Poniższy przykład uruchamia zadanie, które zawiera wywołanie metody Delay(TimeSpan, CancellationToken) z opóźnieniem 1,5 sekundy. Przed upływem interwału opóźnienia token zostanie anulowany. Dane wyjściowe z przykładu pokazują, że w wyniku TaskCanceledException jest zgłaszana, a właściwość Status zadań jest ustawiona na wartość 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

Należy pamiętać, że ten przykład zawiera potencjalny warunek wyścigu: zależy od asynchronicznego wykonywania zadania po anulowaniu tokenu. Mimo że opóźnienie 1,5 sekundy z wywołania metody Delay(TimeSpan, CancellationToken) sprawia, że założenie jest prawdopodobne, jednak istnieje możliwość, że wywołanie metody Delay(TimeSpan, CancellationToken) może zostać zwrócone przed anulowaniem tokenu. W takim przypadku przykład generuje następujące dane wyjściowe:

Task t Status: RanToCompletion, Result: 42

Uwagi

Jeśli token anulowania zostanie zasygnalizowany przed określonym opóźnieniem czasu, wynik TaskCanceledException wyjątku i zadanie zostanie ukończone w stanie Canceled. W przeciwnym razie zadanie jest wykonywane w stanie RanToCompletion po upływie określonego czasu.

Aby zapoznać się ze scenariuszami użycia i dodatkowymi przykładami, zobacz dokumentację przeciążenia Delay(Int32).

Ta metoda zależy od zegara systemowego. Oznacza to, że opóźnienie czasu będzie w przybliżeniu równe rozdzielczości zegara systemowego, jeśli argument delay jest mniejszy niż rozdzielczość zegara systemowego, który wynosi około 15 milisekund w systemach Windows.

Nuta

Zegar systemowy, który jest używany jest ten sam zegar używany przez GetTickCount, który nie ma wpływu na zmiany wprowadzone w timeBeginPeriod i timeEndPeriod.

Dotyczy

Delay(TimeSpan, TimeProvider)

Źródło:
Task.cs
Źródło:
Task.cs

Tworzy zadanie, które zostanie ukończone po określonym interwale czasu.

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

TimeSpan czekać przed ukończeniem zwróconego zadania lub InfiniteTimeSpan czekać na czas nieokreślony.

timeProvider
TimeProvider

TimeProvider, za pomocą którego należy interpretować delay.

Zwraca

Zadanie reprezentujące opóźnienie czasowe.

Wyjątki

delay reprezentuje ujemny interwał czasu inny niż InfiniteTimeSpan.

-lub-

właściwość TotalMillisecondsdelayjest większa niż 4294967294.

Argument timeProvider to null.

Dotyczy

Delay(TimeSpan, TimeProvider, CancellationToken)

Źródło:
Task.cs
Źródło:
Task.cs

Tworzy zadanie, które można anulować, które zostanie ukończone po określonym interwale czasu.

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

TimeSpan czekać przed ukończeniem zwróconego zadania lub InfiniteTimeSpan czekać na czas nieokreślony.

timeProvider
TimeProvider

TimeProvider, za pomocą którego należy interpretować delay.

cancellationToken
CancellationToken

Token anulowania do obserwowania podczas oczekiwania na ukończenie zadania.

Zwraca

Zadanie reprezentujące opóźnienie czasowe.

Wyjątki

delay reprezentuje ujemny interwał czasu inny niż InfiniteTimeSpan.

-lub-

właściwość TotalMillisecondsdelayjest większa niż 4294967294.

Argument timeProvider to null.

Token anulowania został anulowany. Ten wyjątek jest przechowywany w zwracanym zadaniu.

Dotyczy