Поделиться через


Task.Delay Метод

Определение

Создает задачу, которая завершится после задержки времени.

Перегрузки

Имя Описание
Delay(Int32)

Создает задачу, которая завершается после указанного числа миллисекунда.

Delay(TimeSpan)

Создает задачу, которая завершается после указанного интервала времени.

Delay(Int32, CancellationToken)

Создает отмененную задачу, которая завершается после указанного числа миллисекунда.

Delay(TimeSpan, CancellationToken)

Создает отмененную задачу, которая завершается после указанного интервала времени.

Delay(TimeSpan, TimeProvider)

Создает задачу, которая завершается после указанного интервала времени.

Delay(TimeSpan, TimeProvider, CancellationToken)

Создает отмененную задачу, которая завершается после указанного интервала времени.

Delay(Int32)

Исходный код:
Task.cs
Исходный код:
Task.cs
Исходный код:
Task.cs
Исходный код:
Task.cs
Исходный код:
Task.cs

Создает задачу, которая завершается после указанного числа миллисекунда.

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

Параметры

millisecondsDelay
Int32

Количество миллисекунда, ожидающих завершения возвращаемой задачи, или -1 ждать неограниченное время.

Возвращаемое значение

Задача, представляющая задержку времени.

Исключения

Аргумент millisecondsDelay меньше -1.

Примеры

В следующем примере показано простое использование 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

Комментарии

Метод Delay обычно используется для задержки операции всех или части задачи в течение указанного интервала времени. Чаще всего происходит задержка времени:

  • В начале задачи, как показано в следующем примере.

    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
    
  • Когда задача выполняется. В этом случае вызов Delay метода выполняется как дочерняя задача в задаче, как показано в следующем примере. Обратите внимание, что так как задача, вызывающая Delay метод, выполняется асинхронно, родительская задача должна ждать завершения с помощью ключевого 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
    

После указанной задержки времени задача завершается в RanToCompletion состоянии.

Этот метод зависит от системных часов. Это означает, что задержка времени примерно равно разрешению системных часов, если millisecondsDelay аргумент меньше разрешения системных часов, что составляет около 15 миллисекунда в системах Windows.

Заметка

Системные часы, используемые, являются теми же часами, которые используются GetTickCount, которые не влияют на изменения, внесенные в timeBeginPeriod и timeEndPeriod.

Применяется к

Delay(TimeSpan)

Исходный код:
Task.cs
Исходный код:
Task.cs
Исходный код:
Task.cs
Исходный код:
Task.cs
Исходный код:
Task.cs

Создает задачу, которая завершается после указанного интервала времени.

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

Параметры

delay
TimeSpan

Интервал времени ожидания перед выполнением возвращаемой задачи или Timeout.InfiniteTimeSpan на неопределенный срок ожидания.

Возвращаемое значение

Задача, представляющая задержку времени.

Исключения

delay представляет отрицательный интервал времени, отличный от Timeout.InfiniteTimeSpan.

-или-

Свойство delay аргумента TotalMilliseconds больше 4294967294 в .NET 6 и более поздних версиях или Int32.MaxValue во всех предыдущих версиях.

Примеры

В следующем примере показано простое использование 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

Комментарии

После указанной задержки времени задача завершается в RanToCompletion состоянии.

Сценарии использования и дополнительные примеры см. в документации по перегрузке Delay(Int32) .

Этот метод зависит от системных часов. Это означает, что задержка времени примерно равно разрешению системных часов, если delay аргумент меньше разрешения системных часов, что составляет около 15 миллисекунда в системах Windows.

Заметка

Системные часы, используемые, являются теми же часами, которые используются GetTickCount, которые не влияют на изменения, внесенные в timeBeginPeriod и timeEndPeriod.

Применяется к

Delay(Int32, CancellationToken)

Исходный код:
Task.cs
Исходный код:
Task.cs
Исходный код:
Task.cs
Исходный код:
Task.cs
Исходный код:
Task.cs

Создает отмененную задачу, которая завершается после указанного числа миллисекунда.

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

Параметры

millisecondsDelay
Int32

Количество миллисекунда, ожидающих завершения возвращаемой задачи, или -1 ждать неограниченное время.

cancellationToken
CancellationToken

Маркер отмены, который следует наблюдать во время ожидания завершения задачи.

Возвращаемое значение

Задача, представляющая задержку времени.

Исключения

Аргумент millisecondsDelay меньше -1.

Задача отменена. Это исключение хранится в возвращаемой задаче.

Предоставленные cancellationToken уже удалены.

Задача отменена.

Примеры

В следующем примере запускается задача, которая включает вызов Delay(Int32, CancellationToken) метода с одной секундой задержки. Перед истечением интервала задержки маркер будет отменен. Выходные данные из примера показывают, что в результате TaskCanceledException создается исключение, а свойство задач Status — значение 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

Комментарии

Если маркер отмены сигнализируется до указанной задержки времени, TaskCanceledException результаты исключения и задача завершается в Canceled состоянии. В противном случае задача завершается в RanToCompletion состоянии после истечения заданной задержки времени.

Сценарии использования и дополнительные примеры см. в документации по перегрузке Delay(Int32) .

Этот метод зависит от системных часов. Это означает, что задержка времени примерно равно разрешению системных часов, если millisecondsDelay аргумент меньше разрешения системных часов, что составляет около 15 миллисекунда в системах Windows.

Заметка

Системные часы, используемые, являются теми же часами, которые используются GetTickCount, которые не влияют на изменения, внесенные в timeBeginPeriod и timeEndPeriod.

Применяется к

Delay(TimeSpan, CancellationToken)

Исходный код:
Task.cs
Исходный код:
Task.cs
Исходный код:
Task.cs
Исходный код:
Task.cs
Исходный код:
Task.cs

Создает отмененную задачу, которая завершается после указанного интервала времени.

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

Параметры

delay
TimeSpan

Интервал времени ожидания перед выполнением возвращаемой задачи или Timeout.InfiniteTimeSpan на неопределенный срок ожидания.

cancellationToken
CancellationToken

Маркер отмены, который следует наблюдать во время ожидания завершения задачи.

Возвращаемое значение

Задача, представляющая задержку времени.

Исключения

delay представляет отрицательный интервал времени, отличный от Timeout.InfiniteTimeSpan.

-или-

Свойство delay аргумента TotalMilliseconds больше 4294967294 в .NET 6 и более поздних версиях или Int32.MaxValue во всех предыдущих версиях.

Задача отменена. Это исключение хранится в возвращаемой задаче.

Предоставленные cancellationToken уже удалены.

Задача отменена.

Примеры

В следующем примере запускается задача, которая включает вызов Delay(TimeSpan, CancellationToken) метода с задержкой 1,5 секунды. Перед истечением интервала задержки маркер будет отменен. Выходные данные из примера показывают, что в результате TaskCanceledException создается исключение, а свойство задач Status — значение 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

Обратите внимание, что этот пример включает потенциальное условие гонки: оно зависит от задачи асинхронно выполнения задержки при отмене маркера. Хотя 1,5-секундная задержка от вызова Delay(TimeSpan, CancellationToken) метода делает это предположение вероятным, возможно Delay(TimeSpan, CancellationToken) , вызов метода может вернуться до отмены маркера. В этом случае в примере создаются следующие выходные данные:

Task t Status: RanToCompletion, Result: 42

Комментарии

Если маркер отмены сигнализируется до указанной задержки времени, TaskCanceledException результаты исключения и задача завершается в Canceled состоянии. В противном случае задача завершается в RanToCompletion состоянии после истечения заданной задержки времени.

Сценарии использования и дополнительные примеры см. в документации по перегрузке Delay(Int32) .

Этот метод зависит от системных часов. Это означает, что задержка времени примерно равно разрешению системных часов, если delay аргумент меньше разрешения системных часов, что составляет около 15 миллисекунда в системах Windows.

Заметка

Системные часы, используемые, являются теми же часами, которые используются GetTickCount, которые не влияют на изменения, внесенные в timeBeginPeriod и timeEndPeriod.

Применяется к

Delay(TimeSpan, TimeProvider)

Исходный код:
Task.cs
Исходный код:
Task.cs
Исходный код:
Task.cs
Исходный код:
Task.cs

Создает задачу, которая завершается после указанного интервала времени.

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

Параметры

delay
TimeSpan

Ожидание TimeSpan перед выполнением возвращаемой задачи или InfiniteTimeSpan ожидание на неопределенный срок.

timeProvider
TimeProvider

С TimeProvider которым следует интерпретировать delay.

Возвращаемое значение

Задача, представляющая задержку времени.

Исключения

delay представляет отрицательный интервал времени, отличный от InfiniteTimeSpan.

-или-

delay TotalMilliseconds Свойство больше 4294967294.

Аргумент timeProvider имеет значение null.

Применяется к

Delay(TimeSpan, TimeProvider, CancellationToken)

Исходный код:
Task.cs
Исходный код:
Task.cs
Исходный код:
Task.cs
Исходный код:
Task.cs

Создает отмененную задачу, которая завершается после указанного интервала времени.

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

Параметры

delay
TimeSpan

Ожидание TimeSpan перед выполнением возвращаемой задачи или InfiniteTimeSpan ожидание на неопределенный срок.

timeProvider
TimeProvider

С TimeProvider которым следует интерпретировать delay.

cancellationToken
CancellationToken

Маркер отмены, который следует наблюдать во время ожидания завершения задачи.

Возвращаемое значение

Задача, представляющая задержку времени.

Исключения

delay представляет отрицательный интервал времени, отличный от InfiniteTimeSpan.

-или-

delay TotalMilliseconds Свойство больше 4294967294.

Аргумент timeProvider имеет значение null.

Маркер отмены был отменен. Это исключение хранится в возвращаемой задаче.

Применяется к