Task.Wait Task.Wait Task.Wait Task.Wait Method

定義

Task の実行が完了するまで待機します。

オーバーロード

Wait(TimeSpan) Wait(TimeSpan) Wait(TimeSpan) Wait(TimeSpan)

提供された Task の実行が完了するまで、指定した時間間隔内の間、待機します。

Wait(Int32, CancellationToken) Wait(Int32, CancellationToken) Wait(Int32, CancellationToken)

Task の実行が完了するまで待機します。 タスクの完了前に、タイムアウト期間が経過するか、キャンセル トークンが取り消される場合には、待機が終了します。

Wait(CancellationToken) Wait(CancellationToken) Wait(CancellationToken)

Task の実行が完了するまで待機します。 タスクの完了前にキャンセル トークンが取り消される場合は、待機が終了します。

Wait(Int32) Wait(Int32) Wait(Int32) Wait(Int32)

提供された Task の実行が完了するまで、指定したミリ秒数以内の間、待機します。

Wait() Wait() Wait() Wait()

Task の実行が完了するまで待機します。

Wait(TimeSpan) Wait(TimeSpan) Wait(TimeSpan) Wait(TimeSpan)

提供された Task の実行が完了するまで、指定した時間間隔内の間、待機します。

public:
 bool Wait(TimeSpan timeout);
public bool Wait (TimeSpan timeout);
member this.Wait : TimeSpan -> bool
Public Function Wait (timeout As TimeSpan) As Boolean

パラメーター

timeout
TimeSpan TimeSpan TimeSpan TimeSpan

待機するミリ秒数を表す TimeSpan。無制限に待機する場合は、-1 ミリ秒を表す TimeSpan

戻り値

割り当てられた時間内に true の実行が完了した場合は Task。それ以外の場合は false

例外

timeout は無限のタイムアウトを表す -1 ミリ秒以外の負の数です。 または timeoutMaxValue より大きくなっています。

タスクが取り消されました。 InnerExceptions コレクションに TaskCanceledException オブジェクトが含まれています。

または タスクの実行時に例外がスローされました。 InnerExceptions コレクションには、例外に関する情報が含まれています。

次の例では、500万の 0 から 100 まで整数の乱数を生成しの平均を計算するタスクを開始します。 この例では、Wait(TimeSpan)メソッドをアプリケーションで 150 ミリ秒以内に完了するまで待機します。 アプリケーションが正常終了した場合、タスクには、それによって生成されたランダムな数値の平均と合計が表示されます。 タイムアウト間隔が経過した場合の例は、終了前にメッセージを表示します。

using System;
using System.Threading.Tasks;

public class Example
{
   public static void Main()
   {
      Task t = Task.Run( () => {
                            Random rnd = new Random();
                            long sum = 0;
                            int n = 5000000;
                            for (int ctr = 1; ctr <= n; ctr++) {
                               int number = rnd.Next(0, 101);
                               sum += number;
                            }
                            Console.WriteLine("Total:   {0:N0}", sum);
                            Console.WriteLine("Mean:    {0:N2}", sum/n);
                            Console.WriteLine("N:       {0:N0}", n);   
                         } );
     TimeSpan ts = TimeSpan.FromMilliseconds(150);
     if (! t.Wait(ts))
        Console.WriteLine("The timeout interval elapsed.");
   }
}
// The example displays output similar to the following:
//       Total:   50,015,714
//       Mean:    50.02
//       N:       1,000,000
// Or it displays the following output:
//      The timeout interval elapsed.
Imports System.Threading.Tasks

Module Example
   Public Sub Main()
      Dim t As Task = Task.Run( Sub()
                                   Dim rnd As New Random()
                                   Dim sum As Long
                                   Dim n As Integer = 5000000
                                   For ctr As Integer = 1 To n
                                      Dim number As Integer = rnd.Next(0, 101)
                                      sum += number
                                   Next
                                   Console.WriteLine("Total:   {0:N0}", sum)
                                   Console.WriteLine("Mean:    {0:N2}", sum/n)
                                   Console.WriteLine("N:       {0:N0}", n)   
                                End Sub)
     Dim ts As TimeSpan = TimeSpan.FromMilliseconds(150)
     If Not t.Wait(ts) Then
        Console.WriteLine("The timeout interval elapsed.")
     End If
   End Sub
End Module
' The example displays output similar to the following:
'       Total:   50,015,714
'       Mean:    50.02
'       N:       1,000,000
' Or it displays the following output:
'       The timeout interval elapsed.

注釈

Wait(TimeSpan) 現在のタスク インスタンスは次のいずれかが発生するまでに完了するを待機する呼び出し元のスレッドを同期方法を示します。

  • タスクが正常に完了します。

  • タスク自体が取り消されたまたは、例外をスローします。 この場合、処理、AggregateException例外。 AggregateException.InnerExceptionsプロパティには、例外の詳細が含まれています。

  • によって定義された間隔timeoutが経過するとします。 この場合は、現在のスレッドが実行を再開し、メソッドを返しますfalseします。

Wait(Int32, CancellationToken) Wait(Int32, CancellationToken) Wait(Int32, CancellationToken)

Task の実行が完了するまで待機します。 タスクの完了前に、タイムアウト期間が経過するか、キャンセル トークンが取り消される場合には、待機が終了します。

public:
 bool Wait(int millisecondsTimeout, System::Threading::CancellationToken cancellationToken);
public bool Wait (int millisecondsTimeout, System.Threading.CancellationToken cancellationToken);
member this.Wait : int * System.Threading.CancellationToken -> bool

パラメーター

millisecondsTimeout
Int32 Int32 Int32 Int32

待機するミリ秒数。無制限に待機する場合は Infinite (-1)。

cancellationToken
CancellationToken CancellationToken CancellationToken CancellationToken

タスクの完了の待機中に観察するキャンセル トークン。

戻り値

割り当てられた時間内に true の実行が完了した場合は Task。それ以外の場合は false

例外

millisecondsTimeout は無限のタイムアウトを表す -1 以外の負の数です。

タスクが取り消されました。 InnerExceptions コレクションに TaskCanceledException オブジェクトが含まれています。

または タスクの実行時に例外がスローされました。 InnerExceptions コレクションには、例外に関する情報が含まれています。

次の例では、Wait(Int32, CancellationToken)タイムアウト値とキャンセル トークンを提供するメソッドは、タスクの完了の待機を終了できます。 新しいスレッドが開始され、実行、CancelTokenメソッドでは、一時停止してから、CancellationTokenSource.Cancelキャンセル トークンをキャンセルするメソッド。 タスクが起動し、5 秒間遅延します。 Waitメソッドが呼び出され、タスクの完了を待つし、簡単なタイムアウト値とキャンセル トークンの両方に提供されます。

using System;
using System.Threading;
using System.Threading.Tasks;

public class Example
{
   public static void Main()
   {
      CancellationTokenSource ts = new CancellationTokenSource();
      Thread thread = new Thread(CancelToken);
      thread.Start(ts);

      Task t = Task.Run( () => { Task.Delay(5000).Wait();
                                 Console.WriteLine("Task ended delay...");
                               });
      try {
         Console.WriteLine("About to wait completion of task {0}", t.Id);
         bool result = t.Wait(1510, ts.Token);
         Console.WriteLine("Wait completed normally: {0}", result);
         Console.WriteLine("The task status:  {0:G}", t.Status);
      }
      catch (OperationCanceledException e) {
         Console.WriteLine("{0}: The wait has been canceled. Task status: {1:G}",
                           e.GetType().Name, t.Status);
         Thread.Sleep(4000);
         Console.WriteLine("After sleeping, the task status:  {0:G}", t.Status);
         ts.Dispose();
      }
   }

   private static void CancelToken(Object obj)
   {
      Thread.Sleep(1500);
      Console.WriteLine("Canceling the cancellation token from thread {0}...",
                        Thread.CurrentThread.ManagedThreadId);
      CancellationTokenSource source = obj as CancellationTokenSource;
      if (source != null) source.Cancel();
   }
}
// The example displays output like the following if the wait is canceled by
// the cancellation token:
//    About to wait completion of task 1
//    Canceling the cancellation token from thread 3...
//    OperationCanceledException: The wait has been canceled. Task status: Running
//    Task ended delay...
//    After sleeping, the task status:  RanToCompletion
// The example displays output like the following if the wait is canceled by
// the timeout interval expiring:
//    About to wait completion of task 1
//    Wait completed normally: False
//    The task status:  Running
//    Canceling the cancellation token from thread 3...
Imports System.Threading
Imports System.Threading.Tasks

Module Example
   Public Sub Main()
      Dim ts As New CancellationTokenSource()
      Dim thread As New Thread(AddressOf CancelToken)
      thread.Start(ts)

      Dim t As Task = Task.Run( Sub()
                                   Task.Delay(5000).Wait()
                                    Console.WriteLine("Task ended delay...")
                                End Sub)
      Try
         Console.WriteLine("About to wait completion of task {0}", t.Id)
         Dim result As Boolean = t.Wait(1510, ts.Token)
         Console.WriteLine("Wait completed normally: {0}", result)
         Console.WriteLine("The task status:  {0:G}", t.Status)
      Catch e As OperationCanceledException
         Console.WriteLine("{0}: The wait has been canceled. Task status: {1:G}",
                           e.GetType().Name, t.Status)
         Thread.Sleep(4000)
         Console.WriteLine("After sleeping, the task status:  {0:G}", t.Status)
         ts.Dispose()
      End Try
   End Sub

   Private Sub CancelToken(obj As Object)
      Thread.Sleep(1500)
      Console.WriteLine("Canceling the cancellation token from thread {0}...",
                        Thread.CurrentThread.ManagedThreadId)

      If TypeOf obj Is CancellationTokenSource Then
         Dim source As CancellationTokenSource = CType(obj, CancellationTokenSource)
         source.Cancel()
      End If
   End Sub
End Module
' The example displays output like the following if the wait is canceled by
' the cancellation token:
'    About to wait completion of task 1
'    Canceling the cancellation token from thread 3...
'    OperationCanceledException: The wait has been canceled. Task status: Running
'    Task ended delay...
'    After sleeping, the task status:  RanToCompletion
' The example displays output like the following if the wait is canceled by
' the timeout interval expiring:
'    About to wait completion of task 1
'    Wait completed normally: False
'    The task status:  Running
'    Canceling the cancellation token from thread 3...

例の正確な出力に依存しているキャンセル トークンのため、待機が取り消されましたかどうか、またはタイムアウト間隔が経過したために注意してください。

注釈

Wait(Int32, CancellationToken) 現在のタスク インスタンスは次のいずれかが発生するまでに完了するを待機する呼び出し元のスレッドを同期方法を示します。

  • タスクが正常に完了します。

  • タスク自体が取り消されたまたは、例外をスローします。 この場合、処理、AggregateException例外。 AggregateException.InnerExceptionsプロパティには、例外の詳細が含まれています。

  • cancellationTokenキャンセル トークンが取り消されました。 この場合、呼び出し、Wait(Int32, CancellationToken)メソッドがスローされます、OperationCanceledExceptionします。

  • によって定義された間隔millisecondsTimeoutが経過するとします。 この場合は、現在のスレッドが実行を再開し、メソッドを返しますfalseします。

注意

キャンセル、cancellationTokenキャンセル トークンも何も起こりませんの実行中のタスクがキャンセル トークンが渡されたも、キャンセルを処理する準備がない場合。 渡す、cancellationTokenこのメソッドにオブジェクトだけになりますをキャンセルできる待機に基づいていくつかの条件にします。

Wait(CancellationToken) Wait(CancellationToken) Wait(CancellationToken)

Task の実行が完了するまで待機します。 タスクの完了前にキャンセル トークンが取り消される場合は、待機が終了します。

public:
 void Wait(System::Threading::CancellationToken cancellationToken);
public void Wait (System.Threading.CancellationToken cancellationToken);
member this.Wait : System.Threading.CancellationToken -> unit

パラメーター

cancellationToken
CancellationToken CancellationToken CancellationToken CancellationToken

タスクの完了の待機中に観察するキャンセル トークン。

例外

タスクが取り消されました。 InnerExceptions コレクションに TaskCanceledException オブジェクトが含まれています。

または タスクの実行時に例外がスローされました。 InnerExceptions コレクションには、例外に関する情報が含まれています。

次の例は、タスクの完了の待機をキャンセルするキャンセル トークンの簡単な使用を示しています。 タスクの起動は、呼び出しのCancellationTokenSource.Cancelを 5 秒間キャンセル トークン ソースのキャンセル トークン、および、遅延のいずれかのメソッド。 タスク自体がキャンセル トークンが渡されていないと、取り消し可能でないことに注意してください。 アプリケーション スレッドの呼び出し、タスクのTask.Wait、キャンセル トークンが取り消された後に、タスクを完了するまで待機するメソッドが、待機が取り消されたOperationCanceledExceptionがスローされます。 例外ハンドラーは、例外を報告し、6 秒間スリープしています。 その遅延によりで完了するタスク、例の出力が示すように、RanToCompletion状態。

using System;
using System.Threading;
using System.Threading.Tasks;

public class Example
{
   public static void Main()
   {
      CancellationTokenSource ts = new CancellationTokenSource();

      Task t = Task.Run( () => { Console.WriteLine("Calling Cancel...");
                                 ts.Cancel();
                                 Task.Delay(5000).Wait();
                                 Console.WriteLine("Task ended delay...");
                               });
      try {
         Console.WriteLine("About to wait for the task to complete...");
         t.Wait(ts.Token);
      }
      catch (OperationCanceledException e) {
         Console.WriteLine("{0}: The wait has been canceled. Task status: {1:G}",
                           e.GetType().Name, t.Status);
         Thread.Sleep(6000);
         Console.WriteLine("After sleeping, the task status:  {0:G}", t.Status);
      }
      ts.Dispose();
   }
}
// The example displays output like the following:
//    About to wait for the task to complete...
//    Calling Cancel...
//    OperationCanceledException: The wait has been canceled. Task status: Running
//    Task ended delay...
//    After sleeping, the task status:  RanToCompletion
Imports System.Threading
Imports System.Threading.Tasks

Module Example
   Public Sub Main()
      Dim ts As New CancellationTokenSource()

      Dim t = Task.Run( Sub()
                           Console.WriteLine("Calling Cancel...")
                           ts.Cancel()
                           Task.Delay(5000).Wait()
                           Console.WriteLine("Task ended delay...")
                        End Sub)
      Try
         Console.WriteLine("About to wait for the task to complete...")
         t.Wait(ts.Token)
      Catch e As OperationCanceledException
         Console.WriteLine("{0}: The wait has been canceled. Task status: {1:G}",
                           e.GetType().Name, t.Status)
         Thread.Sleep(6000)
         Console.WriteLine("After sleeping, the task status:  {0:G}", t.Status)
      End Try
      ts.Dispose()
   End Sub
End Module
' The example displays output like the following:
'    About to wait for the task to complete...
'    Calling Cancel...
'    OperationCanceledException: The wait has been canceled. Task status: Running
'    Task ended delay...
'    After sleeping, the task status:  RanToCompletion

注釈

Wait(CancellationToken)メソッドがキャンセル可能な待機を作成します。 これは、次のいずれかが発生するまで待機する、現在のスレッドが発生します。

注意

キャンセル、cancellationTokenキャンセル トークンも何も起こりませんの実行中のタスクがキャンセル トークンが渡されたも、キャンセルを処理する準備がない場合。 渡す、cancellationTokenオブジェクトをこのメソッドは、待機が取り消さだけになります。

Wait(Int32) Wait(Int32) Wait(Int32) Wait(Int32)

提供された Task の実行が完了するまで、指定したミリ秒数以内の間、待機します。

public:
 bool Wait(int millisecondsTimeout);
public bool Wait (int millisecondsTimeout);
member this.Wait : int -> bool
Public Function Wait (millisecondsTimeout As Integer) As Boolean

パラメーター

millisecondsTimeout
Int32 Int32 Int32 Int32

待機するミリ秒数。無制限に待機する場合は Infinite (-1)。

戻り値

割り当てられた時間内に true の実行が完了した場合は Task。それ以外の場合は false

例外

millisecondsTimeout は無限のタイムアウトを表す -1 以外の負の数です。

タスクが取り消されました。 InnerExceptions コレクションに TaskCanceledException オブジェクトが含まれています。

または タスクの実行時に例外がスローされました。 InnerExceptions コレクションには、例外に関する情報が含まれています。

次の例では、500万の 0 から 100 まで整数の乱数を生成しの平均を計算するタスクを開始します。 この例では、Wait(Int32)メソッドをアプリケーションで 150 ミリ秒以内に完了するまで待機します。 アプリケーションが正常終了した場合、タスクには、それによって生成されたランダムな数値の平均と合計が表示されます。 タイムアウト間隔が経過した場合の例は、終了前にメッセージを表示します。

using System;
using System.Threading.Tasks;

public class Example
{
   public static void Main()
   {
      Task t = Task.Run( () => {
                            Random rnd = new Random();
                            long sum = 0;
                            int n = 5000000;
                            for (int ctr = 1; ctr <= n; ctr++) {
                               int number = rnd.Next(0, 101);
                               sum += number;
                            }
                            Console.WriteLine("Total:   {0:N0}", sum);
                            Console.WriteLine("Mean:    {0:N2}", sum/n);
                            Console.WriteLine("N:       {0:N0}", n);   
                         } );
     if (! t.Wait(150))
        Console.WriteLine("The timeout interval elapsed.");
   }
}
// The example displays output similar to the following:
//       Total:   50,015,714
//       Mean:    50.02
//       N:       1,000,000
// Or it displays the following output:
//      The timeout interval elapsed.
Imports System.Threading.Tasks

Module Example
   Public Sub Main()
      Dim t As Task = Task.Run( Sub()
                                   Dim rnd As New Random()
                                   Dim sum As Long
                                   Dim n As Integer = 5000000
                                   For ctr As Integer = 1 To n
                                      Dim number As Integer = rnd.Next(0, 101)
                                      sum += number
                                   Next
                                   Console.WriteLine("Total:   {0:N0}", sum)
                                   Console.WriteLine("Mean:    {0:N2}", sum/n)
                                   Console.WriteLine("N:       {0:N0}", n)   
                                End Sub)
     If Not t.Wait(150) Then
        Console.WriteLine("The timeout interval elapsed.")
     End If
   End Sub
End Module
' The example displays output similar to the following:
'       Total:   50,015,714
'       Mean:    50.02
'       N:       1,000,000
' Or it displays the following output:
'       The timeout interval elapsed.

注釈

Wait(Int32) 現在のタスク インスタンスは次のいずれかが発生するまでに完了するを待機する呼び出し元のスレッドを同期方法を示します。

  • タスクが正常に完了します。

  • タスク自体が取り消されたまたは、例外をスローします。 この場合、処理、AggregateException例外。 AggregateException.InnerExceptionsプロパティには、例外の詳細が含まれています。

  • によって定義された間隔millisecondsTimeoutが経過するとします。 この場合は、現在のスレッドが実行を再開し、メソッドを返しますfalseします。

Wait() Wait() Wait() Wait()

Task の実行が完了するまで待機します。

public:
 void Wait();
public void Wait ();
member this.Wait : unit -> unit
Public Sub Wait ()

例外

タスクが取り消されました。 InnerExceptions コレクションに TaskCanceledException オブジェクトが含まれています。

または タスクの実行時に例外がスローされました。 InnerExceptions コレクションには、例外に関する情報が含まれています。

次の例では、100万の 0 から 100 まで整数の乱数を生成しの平均を計算するタスクを開始します。 この例では、Waitメソッドをアプリケーションが終了する前に、タスクが完了したことを確認します。 それ以外の場合、これは、コンソール アプリケーションであるため、例では、終了が終了前に、タスクを計算して、平均値を表示できます。

using System;
using System.Threading.Tasks;

public class Example
{
   public static void Main()
   {
      Task t = Task.Run( () => {
                            Random rnd = new Random();
                            long sum = 0;
                            int n = 1000000;
                            for (int ctr = 1; ctr <= n; ctr++) {
                               int number = rnd.Next(0, 101);
                               sum += number;
                            }
                            Console.WriteLine("Total:   {0:N0}", sum);
                            Console.WriteLine("Mean:    {0:N2}", sum/n);
                            Console.WriteLine("N:       {0:N0}", n);   
                         } );
     t.Wait();
   }
}
// The example displays output similar to the following:
//       Total:   50,015,714
//       Mean:    50.02
//       N:       1,000,000
Imports System.Threading.Tasks

Module Example
   Public Sub Main()
      Dim t As Task = Task.Run( Sub()
                                   Dim rnd As New Random()
                                   Dim sum As Long
                                   Dim n As Integer = 1000000
                                   For ctr As Integer = 1 To n
                                      Dim number As Integer = rnd.Next(0, 101)
                                      sum += number
                                   Next
                                   Console.WriteLine("Total:   {0:N0}", sum)
                                   Console.WriteLine("Mean:    {0:N2}", sum/n)
                                   Console.WriteLine("N:       {0:N0}", n)   
                                End Sub)
     t.Wait()
   End Sub
End Module
' The example displays output similar to the following:
'       Total:   50,015,714
'       Mean:    50.02
'       N:       1,000,000

注釈

Wait 現在のタスクが完了するまで待機する呼び出し元のスレッド同期メソッドです。 現在のタスクが実行を開始していない場合、Wait メソッドは、スケジューラのタスクを削除し、現在のスレッドでインライン実行を試みます。 行うことがない場合、または現在のタスクが既に実行を開始した場合は、タスクが完了するまで、呼び出し元のスレッドをブロックします。 詳細については、次を参照してください。 Task.Wait と"インライン" .NET ブログでの並列プログラミングにします。

こちらもご覧ください

適用対象