共用方式為


Task.Delay 方法

定義

建立在時間延遲之後完成的工作。

多載

名稱 Description
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 小於系統時鐘的解析度(Windows 系統約為 15 毫秒),時間延遲大致等於系統時鐘的解析度。

注意

所使用的系統時鐘與 GetTickCount 相同,且不受 timeBeginPeriodtimeEndPeriod 的變更影響。

適用於

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的性質在 .NET 6 及以上版本中大於 4294967294,或在所有先前版本中大於 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 小於系統時鐘的解析度(Windows 系統約為 15 毫秒),時間延遲大致等於系統時鐘的解析度。

注意

所使用的系統時鐘與 GetTickCount 相同,且不受 timeBeginPeriodtimeEndPeriod 的變更影響。

適用於

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) 方法。 在延遲間隔經過之前,令牌會取消。 範例輸出顯示,因此拋出 a 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 小於系統時鐘的解析度(Windows 系統約為 15 毫秒),時間延遲大致等於系統時鐘的解析度。

注意

所使用的系統時鐘與 GetTickCount 相同,且不受 timeBeginPeriodtimeEndPeriod 的變更影響。

適用於

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的性質在 .NET 6 及以上版本中大於 4294967294,或在所有先前版本中大於 Int32.MaxValue

工作已取消。 此例外狀況會儲存在傳回的工作中。

所提供的 cancellationToken 已經被處理掉。

工作已取消。

範例

以下範例啟動一項任務,包含對方法的呼叫 Delay(TimeSpan, CancellationToken) ,延遲為 1.5 秒。 在延遲間隔經過之前,令牌會取消。 範例輸出顯示,因此拋出 a 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

請注意,此範例包含潛在的競爭條件:這取決於在取消令牌時以異步方式執行延遲的工作。 雖然呼叫至方法的延遲 Delay(TimeSpan, CancellationToken) 1.5 秒使此假設成立,但仍有可能呼叫 Delay(TimeSpan, CancellationToken) 回傳至該方法,且標記尚未取消。 在此情況下,此範例會產生下列輸出:

Task t Status: RanToCompletion, Result: 42

備註

若取消標記在指定時間延遲前被發出訊號,則會產生 TaskCanceledException 例外,任務在該 Canceled 狀態下完成。 否則,任務在指定時間延遲過後即在該 RanToCompletion 狀態下完成。

關於使用情境及更多範例,請參閱過載文件 Delay(Int32)

這個方法取決於系統時鐘。 這表示如果參數 delay 小於系統時鐘的解析度(Windows 系統約為 15 毫秒),時間延遲大致等於系統時鐘的解析度。

注意

所使用的系統時鐘與 GetTickCount 相同,且不受 timeBeginPeriodtimeEndPeriod 的變更影響。

適用於

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之外的負時間區間。

-或-

delayTotalMilliseconds 財產大於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之外的負時間區間。

-或-

delayTotalMilliseconds 財產大於4294967294。

timeProvider 點為 null

取消令牌已取消。 此例外狀況會儲存在傳回的工作中。

適用於