Task.Delay Methode
Definitie
Belangrijk
Bepaalde informatie heeft betrekking op een voorlopige productversie die aanzienlijk kan worden gewijzigd voordat deze wordt uitgebracht. Microsoft biedt geen enkele expliciete of impliciete garanties met betrekking tot de informatie die hier wordt verstrekt.
Hiermee maakt u een taak die na een tijdsvertraging wordt voltooid.
Overloads
| Name | Description |
|---|---|
| Delay(TimeSpan, CancellationToken) |
Hiermee maakt u een geannuleerde taak die na een opgegeven tijdsinterval wordt voltooid. |
| Delay(Int32, CancellationToken) |
Hiermee maakt u een geannuleerde taak die na een opgegeven aantal milliseconden wordt voltooid. |
| Delay(Int32) |
Hiermee maakt u een taak die na een opgegeven aantal milliseconden wordt voltooid. |
| Delay(TimeSpan) |
Hiermee maakt u een taak die na een opgegeven tijdsinterval wordt voltooid. |
Delay(TimeSpan, CancellationToken)
Hiermee maakt u een geannuleerde taak die na een opgegeven tijdsinterval wordt voltooid.
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
Parameters
- delay
- TimeSpan
De tijdsduur die moet worden gewacht voordat de geretourneerde taak wordt voltooid of Timeout.InfiniteTimeSpan voor onbepaalde tijd moet wachten.
- cancellationToken
- CancellationToken
Een annuleringstoken dat u kunt observeren terwijl wordt gewacht totdat de taak is voltooid.
Retouren
Een taak die de tijdsvertraging aangeeft.
Uitzonderingen
delay vertegenwoordigt een ander tijdsinterval dan Timeout.InfiniteTimeSpan.
– of –
De eigenschap delay van het argument TotalMilliseconds is groter dan 4294967294 op .NET 6 en hoger, of Int32.MaxValue op alle vorige versies.
De taak is geannuleerd. Deze uitzondering wordt opgeslagen in de geretourneerde taak.
De opgegeven cancellationToken is al verwijderd.
De taak is geannuleerd.
Voorbeelden
In het volgende voorbeeld wordt een taak gestart met een aanroep naar de Delay(TimeSpan, CancellationToken) methode met een vertraging van 1,5 seconden. Voordat het vertragingsinterval is verstreken, wordt het token geannuleerd. In de uitvoer van het voorbeeld ziet u dat er als gevolg hiervan een TaskCanceledException wordt gegenereerd en dat de eigenschap van Status de taken is ingesteld op 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
Houd er rekening mee dat dit voorbeeld een potentiële racevoorwaarde bevat: dit is afhankelijk van de taak die de vertraging asynchroon uitvoert wanneer het token wordt geannuleerd. Hoewel de vertraging van 1,5 seconden van de aanroep naar de Delay(TimeSpan, CancellationToken) methode waarschijnlijk maakt, is het echter mogelijk dat de aanroep van de Delay(TimeSpan, CancellationToken) methode kan worden geretourneerd voordat het token wordt geannuleerd. In dat geval produceert het voorbeeld de volgende uitvoer:
Task t Status: RanToCompletion, Result: 42
Opmerkingen
Als het annuleringstoken wordt gesignaleerd vóór de opgegeven tijdsvertraging, wordt een TaskCanceledException uitzonderingsresultaten en wordt de taak voltooid in de Canceled status. Anders wordt de taak voltooid in de RanToCompletion status zodra de opgegeven tijdsvertraging is verstreken.
Zie de documentatie voor de Delay(Int32) overbelasting voor gebruiksscenario's en aanvullende voorbeelden.
Deze methode is afhankelijk van de systeemklok. Dit betekent dat de tijdsvertraging ongeveer gelijk is aan de resolutie van de systeemklok als het argument delay kleiner is dan de resolutie van de systeemklok, die ongeveer 15 milliseconden op Windows systemen is.
Note
De systeemklok die wordt gebruikt, is dezelfde klok die wordt gebruikt door GetTickCount, die niet wordt beïnvloed door wijzigingen die zijn aangebracht met timeBeginPeriod en timeEndPeriod.
Van toepassing op
Delay(Int32, CancellationToken)
Hiermee maakt u een geannuleerde taak die na een opgegeven aantal milliseconden wordt voltooid.
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
Parameters
- millisecondsDelay
- Int32
Het aantal milliseconden dat moet worden gewacht voordat de geretourneerde taak wordt voltooid of -1 voor onbepaalde tijd te wachten.
- cancellationToken
- CancellationToken
Een annuleringstoken dat u kunt observeren terwijl wordt gewacht totdat de taak is voltooid.
Retouren
Een taak die de tijdsvertraging aangeeft.
Uitzonderingen
Het millisecondsDelay argument is kleiner dan -1.
De taak is geannuleerd. Deze uitzondering wordt opgeslagen in de geretourneerde taak.
De opgegeven cancellationToken is al verwijderd.
De taak is geannuleerd.
Voorbeelden
In het volgende voorbeeld wordt een taak gestart met een aanroep naar de Delay(Int32, CancellationToken) methode met een vertraging van één seconde. Voordat het vertragingsinterval is verstreken, wordt het token geannuleerd. In de uitvoer van het voorbeeld ziet u dat er als gevolg hiervan een TaskCanceledException wordt gegenereerd en dat de eigenschap van Status de taken is ingesteld op 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
Opmerkingen
Als het annuleringstoken wordt gesignaleerd vóór de opgegeven tijdsvertraging, wordt een TaskCanceledException uitzonderingsresultaten en wordt de taak voltooid in de Canceled status. Anders wordt de taak voltooid in de RanToCompletion status zodra de opgegeven tijdsvertraging is verstreken.
Zie de documentatie voor de Delay(Int32) overbelasting voor gebruiksscenario's en aanvullende voorbeelden.
Deze methode is afhankelijk van de systeemklok. Dit betekent dat de tijdsvertraging ongeveer gelijk is aan de resolutie van de systeemklok als het argument millisecondsDelay kleiner is dan de resolutie van de systeemklok, die ongeveer 15 milliseconden op Windows systemen is.
Note
De systeemklok die wordt gebruikt, is dezelfde klok die wordt gebruikt door GetTickCount, die niet wordt beïnvloed door wijzigingen die zijn aangebracht met timeBeginPeriod en timeEndPeriod.
Van toepassing op
Delay(Int32)
Hiermee maakt u een taak die na een opgegeven aantal milliseconden wordt voltooid.
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
Parameters
- millisecondsDelay
- Int32
Het aantal milliseconden dat moet worden gewacht voordat de geretourneerde taak wordt voltooid of -1 voor onbepaalde tijd te wachten.
Retouren
Een taak die de tijdsvertraging aangeeft.
Uitzonderingen
Het millisecondsDelay argument is kleiner dan -1.
Voorbeelden
In het volgende voorbeeld ziet u een eenvoudig gebruik van de Delay methode.
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
Opmerkingen
De Delay methode wordt doorgaans gebruikt om de werking van een taak voor een bepaald tijdsinterval te vertragen. Meestal wordt de tijdsvertraging geïntroduceerd:
Aan het begin van de taak, zoals in het volgende voorbeeld wordt weergegeven.
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: 1013Soms terwijl de taak wordt uitgevoerd. In dit geval wordt de aanroep van de Delay methode uitgevoerd als een onderliggende taak binnen een taak, zoals in het volgende voorbeeld wordt weergegeven. Aangezien de taak die de Delay methode aanroept asynchroon wordt uitgevoerd, moet de bovenliggende taak wachten tot deze is voltooid met behulp van het
awaittrefwoord.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
Na de opgegeven tijdsvertraging wordt de taak voltooid in de RanToCompletion status.
Deze methode is afhankelijk van de systeemklok. Dit betekent dat de tijdsvertraging ongeveer gelijk is aan de resolutie van de systeemklok als het argument millisecondsDelay kleiner is dan de resolutie van de systeemklok, die ongeveer 15 milliseconden op Windows systemen is.
Note
De systeemklok die wordt gebruikt, is dezelfde klok die wordt gebruikt door GetTickCount, die niet wordt beïnvloed door wijzigingen die zijn aangebracht met timeBeginPeriod en timeEndPeriod.
Van toepassing op
Delay(TimeSpan)
Hiermee maakt u een taak die na een opgegeven tijdsinterval wordt voltooid.
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
Parameters
- delay
- TimeSpan
De tijdsduur die moet worden gewacht voordat de geretourneerde taak wordt voltooid of Timeout.InfiniteTimeSpan voor onbepaalde tijd moet wachten.
Retouren
Een taak die de tijdsvertraging aangeeft.
Uitzonderingen
delay vertegenwoordigt een ander tijdsinterval dan Timeout.InfiniteTimeSpan.
– of –
De eigenschap delay van het argument TotalMilliseconds is groter dan 4294967294 op .NET 6 en hoger, of Int32.MaxValue op alle vorige versies.
Voorbeelden
In het volgende voorbeeld ziet u een eenvoudig gebruik van de Delay methode.
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
Opmerkingen
Na de opgegeven tijdsvertraging wordt de taak voltooid in RanToCompletion de status.
Zie de documentatie voor de Delay(Int32) overbelasting voor gebruiksscenario's en aanvullende voorbeelden.
Deze methode is afhankelijk van de systeemklok. Dit betekent dat de tijdsvertraging ongeveer gelijk is aan de resolutie van de systeemklok als het argument delay kleiner is dan de resolutie van de systeemklok, die ongeveer 15 milliseconden op Windows systemen is.
Note
De systeemklok die wordt gebruikt, is dezelfde klok die wordt gebruikt door GetTickCount, die niet wordt beïnvloed door wijzigingen die zijn aangebracht met timeBeginPeriod en timeEndPeriod.