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 引数がシステム クロックの解像度 (Windows システムでは約 15 ミリ秒) より小さい場合、遅延時間はシステム クロックの解像度とほぼ同じになります。

手記

使用されるシステム クロックは、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以外の負の時間間隔を表します。

-又は-

引数の プロパティは、.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で使用されるのと同じクロックであり、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 は既に破棄されています。

タスクが取り消されました。

次の例では、1 秒の遅延で 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 引数がシステム クロックの解像度 (Windows システムでは約 15 ミリ秒) より小さい場合、遅延時間はシステム クロックの解像度とほぼ同じになります。

手記

使用されるシステム クロックは、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以外の負の時間間隔を表します。

-又は-

引数の プロパティは、.NET 6 以降のバージョンでは4294967294より大きいか、以前のすべてのバージョンで Int32.MaxValue を します。

タスクが取り消されました。 この例外は、返されたタスクに格納されます。

指定された cancellationToken は既に破棄されています。

タスクが取り消されました。

次の例では、1.5 秒の遅延で Delay(TimeSpan, 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(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で使用されるのと同じクロックであり、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

delayを解釈する TimeProvider

戻り値

遅延時間を表すタスク。

例外

delay は、InfiniteTimeSpan以外の負の時間間隔を表します。

-又は-

delay's 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

delayを解釈する TimeProvider

cancellationToken
CancellationToken

タスクの完了を待機している間に観察するキャンセル トークン。

戻り値

遅延時間を表すタスク。

例外

delay は、InfiniteTimeSpan以外の負の時間間隔を表します。

-又は-

delay's TotalMilliseconds プロパティが 4294967294 より大きい。

timeProvider 引数は nullです。

キャンセル トークンが取り消されました。 この例外は、返されたタスクに格納されます。

適用対象