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: 1013let 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: 1013Dim 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: 2501let 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: 2501Dim 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.
Маркер отмены был отменен. Это исключение хранится в возвращаемой задаче.