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
Создает задачу, которая завершается через заданное количество миллисекунд.
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
Создает задачу, которая завершается через заданное время.
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
Создает отменяемую задачу, которая завершается через заданное количество миллисекунд.
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
Создает отменяемую задачу, которая завершается через заданное время.
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
Создает задачу, которая завершается через заданное время.
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
Создает отменяемую задачу, которая завершается через заданное время.
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
.
Маркер отмены был отменен. Это исключение сохраняется в возвращаемой задаче.
Применяется к
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по