Task.Delay Methode

Definitie

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: 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
    
  • Soms 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 await trefwoord.

    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
    

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.

Van toepassing op