Task クラス

定義

非同期操作を表します。

public ref class Task : IAsyncResult
public ref class Task : IAsyncResult, IDisposable
public class Task : IAsyncResult
public class Task : IAsyncResult, IDisposable
type Task = class
    interface IAsyncResult
type Task = class
    interface IAsyncResult
    interface IDisposable
Public Class Task
Implements IAsyncResult
Public Class Task
Implements IAsyncResult, IDisposable
継承
Task
派生
実装

注釈

Task クラスは、値を返さない 1 つの操作を表し、通常は非同期的に実行されます。 Task オブジェクトは、 タスク ベースの非同期パターンの中心的なコンポーネントの 1 つです。 通常、 Task オブジェクトによって実行される処理は、メイン アプリケーション スレッドではなくスレッド プール スレッドで非同期に実行されるため、 Status プロパティと、 IsCanceledIsCompleted、および IsFaulted プロパティを使用して、タスクの状態を判断できます。 最も一般的には、ラムダ式を使用して、タスクが実行する作業を指定します。

値を返す操作では、 Task<TResult> クラスを使用します。

タスクのインスタンス化

次の例では、4 つのタスクを作成して実行します。 3 つのタスクは、Action<T> という名前のactionデリゲートを実行します。このデリゲートは、Object型の引数を受け入れます。 4 番目のタスクは、タスク作成メソッドの呼び出しでインラインで定義されたラムダ式 ( Action デリゲート) を実行します。 各タスクはインスタンス化され、異なる方法で実行されます。

  • タスク t1は Task クラス コンストラクターを呼び出すことによってインスタンス化されますが、タスク Start()が開始された後にのみ、t2 メソッドを呼び出すことによって開始されます。

  • タスク t2 は、 TaskFactory.StartNew(Action<Object>, Object) メソッドを呼び出すことによって、1 つのメソッド呼び出しでインスタンス化され、開始されます。

  • タスク t3 は、 Run(Action) メソッドを呼び出すことによって、1 つのメソッド呼び出しでインスタンス化され、開始されます。

  • タスク t4 は、 RunSynchronously() メソッドを呼び出すことによって、メイン スレッドで同期的に実行されます。

タスク t4 同期的に実行されるため、メイン アプリケーション スレッドで実行されます。 残りのタスクは、通常、1 つ以上のスレッド プール スレッドで非同期的に実行されます。

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

class Example
{
    static void Main()
    {
        Action<object> action = (object obj) =>
                                {
                                   Console.WriteLine("Task={0}, obj={1}, Thread={2}",
                                   Task.CurrentId, obj,
                                   Thread.CurrentThread.ManagedThreadId);
                                };

        // Create a task but do not start it.
        Task t1 = new Task(action, "alpha");

        // Construct a started task
        Task t2 = Task.Factory.StartNew(action, "beta");
        // Block the main thread to demonstrate that t2 is executing
        t2.Wait();

        // Launch t1 
        t1.Start();
        Console.WriteLine("t1 has been launched. (Main Thread={0})",
                          Thread.CurrentThread.ManagedThreadId);
        // Wait for the task to finish.
        t1.Wait();

        // Construct a started task using Task.Run.
        String taskData = "delta";
        Task t3 = Task.Run( () => {Console.WriteLine("Task={0}, obj={1}, Thread={2}",
                                                     Task.CurrentId, taskData,
                                                      Thread.CurrentThread.ManagedThreadId);
                                   });
        // Wait for the task to finish.
        t3.Wait();

        // Construct an unstarted task
        Task t4 = new Task(action, "gamma");
        // Run it synchronously
        t4.RunSynchronously();
        // Although the task was run synchronously, it is a good practice
        // to wait for it in the event exceptions were thrown by the task.
        t4.Wait();
    }
}
// The example displays output like the following:
//       Task=1, obj=beta, Thread=3
//       t1 has been launched. (Main Thread=1)
//       Task=2, obj=alpha, Thread=4
//       Task=3, obj=delta, Thread=3
//       Task=4, obj=gamma, Thread=1
open System.Threading
open System.Threading.Tasks

let action =
    fun (obj: obj) -> printfn $"Task={Task.CurrentId}, obj={obj}, Thread={Thread.CurrentThread.ManagedThreadId}"

// Create a task but do not start it.
let t1 = new Task(action, "alpha")

// Construct a started task
let t2 = Task.Factory.StartNew(action, "beta")
// Block the main thread to demonstrate that t2 is executing
t2.Wait()

// Launch t1
t1.Start()
printfn $"t1 has been launched. (Main Thread={Thread.CurrentThread.ManagedThreadId})"
// Wait for the task to finish.
t1.Wait()

// Construct a started task using Task.Run.
let taskData = "delta"

let t3 =
    Task.Run(fun () -> printfn $"Task={Task.CurrentId}, obj={taskData}, Thread={Thread.CurrentThread.ManagedThreadId}")
// Wait for the task to finish.
t3.Wait()

// Construct an unstarted task
let t4 = new Task(action, "gamma")
// Run it synchronously
t4.RunSynchronously()
// Although the task was run synchronously, it is a good practice
// to wait for it in the event exceptions were thrown by the task.
t4.Wait()


// The example displays output like the following:
//       Task=1, obj=beta, Thread=3
//       t1 has been launched. (Main Thread=1)
//       Task=2, obj=alpha, Thread=4
//       Task=3, obj=delta, Thread=3
//       Task=4, obj=gamma, Thread=1
Imports System.Threading
Imports System.Threading.Tasks

Module Example2
    Public Sub Main()
        Dim action As Action(Of Object) =
              Sub(obj As Object)
                  Console.WriteLine("Task={0}, obj={1}, Thread={2}",
                 Task.CurrentId, obj,
                 Thread.CurrentThread.ManagedThreadId)
              End Sub

        ' Construct an unstarted task
        Dim t1 As New Task(action, "alpha")

        ' Construct a started task
        Dim t2 As Task = Task.Factory.StartNew(action, "beta")
        ' Block the main thread to demonstrate that t2 is executing
        t2.Wait()

        ' Launch t1 
        t1.Start()
        Console.WriteLine("t1 has been launched. (Main Thread={0})",
                          Thread.CurrentThread.ManagedThreadId)
        ' Wait for the task to finish.
        t1.Wait()

        ' Construct a started task using Task.Run.
        Dim taskData As String = "delta"
        Dim t3 As Task = Task.Run(Sub()
                                      Console.WriteLine("Task={0}, obj={1}, Thread={2}",
                                     Task.CurrentId, taskData,
                                     Thread.CurrentThread.ManagedThreadId)
                                  End Sub)
        ' Wait for the task to finish.
        t3.Wait()

        ' Construct an unstarted task
        Dim t4 As New Task(action, "gamma")
        ' Run it synchronously
        t4.RunSynchronously()
        ' Although the task was run synchronously, it is a good practice
        ' to wait for it in the event exceptions were thrown by the task.
        t4.Wait()
    End Sub
End Module
' The example displays output like the following:
'       Task=1, obj=beta, Thread=3
'       t1 has been launched. (Main Thread=1)
'       Task=2, obj=alpha, Thread=3
'       Task=3, obj=delta, Thread=3
'       Task=4, obj=gamma, Thread=1

タスクを作成して実行する

Taskインスタンスは、さまざまな方法で作成できます。 最も一般的な方法は、静的 Run メソッドを呼び出す方法です。 Run メソッドは、既定値を使用してタスクを開始する簡単な方法を提供し、追加のパラメーターを必要としません。 次の例では、 Run(Action) メソッドを使用して、ループするタスクを開始し、ループイテレーションの数を表示します。

using System;
using System.Threading.Tasks;

public class Example
{
   public static async Task Main()
   {
      await Task.Run( () => {
                                  // Just loop.
                                  int ctr = 0;
                                  for (ctr = 0; ctr <= 1000000; ctr++)
                                  {}
                                  Console.WriteLine("Finished {0} loop iterations",
                                                    ctr);
                               } );
   }
}
// The example displays the following output:
//        Finished 1000001 loop iterations
open System.Threading.Tasks

let main =
    task {
        do!
            Task.Run(fun () ->
                for i = 0 to 1000000 do
                    printfn $"Finished {i} loop iterations")
    }

main.Wait()

// The example displays the following output:
//        Finished 1000001 loop iterations
Imports System.Threading.Tasks

Module Example1
    Public Sub Main()
        Dim t As Task = Task.Run(Sub()
                                     ' Just loop.
                                     Dim ctr As Integer = 0
                                     For ctr = 0 To 1000000
                                     Next
                                     Console.WriteLine("Finished {0} loop iterations",
                                                    ctr)
                                 End Sub)
        t.Wait()
    End Sub
End Module
' The example displays the following output:
'       Finished 1000001 loop iterations

別の方法として、静的 TaskFactory.StartNew メソッドがあります。 Task.Factory プロパティは TaskFactory オブジェクトを返します。 TaskFactory.StartNew メソッドのオーバーロードを使用すると、タスク作成オプションとタスク スケジューラに渡すパラメーターを指定できます。 次の例では、 TaskFactory.StartNew メソッドを使用してタスクを開始します。 これは、前の例のコードと機能的に同等です。

using System;
using System.Threading.Tasks;

public class Example
{
   public static void Main()
   {
      Task t = Task.Factory.StartNew( () => {
                                  // Just loop.
                                  int ctr = 0;
                                  for (ctr = 0; ctr <= 1000000; ctr++)
                                  {}
                                  Console.WriteLine("Finished {0} loop iterations",
                                                    ctr);
                               } );
      t.Wait();
   }
}
// The example displays the following output:
//        Finished 1000001 loop iterations
open System.Threading.Tasks

let t =
    Task.Factory.StartNew(fun () ->
        // Just loop.
        for i = 0 to 1000000 do
            printfn $"Finished {i} loop iterations")

t.Wait()


// The example displays the following output:
//        Finished 1000001 loop iterations
Imports System.Threading.Tasks

Module Example3
    Public Sub Main()
        Dim t As Task = Task.Factory.StartNew(Sub()
                                                  ' Just loop.
                                                  Dim ctr As Integer = 0
                                                  For ctr = 0 To 1000000
                                                  Next
                                                  Console.WriteLine("Finished {0} loop iterations",
                                                    ctr)
                                              End Sub)
        t.Wait()
    End Sub
End Module
' The example displays the following output:
'       Finished 1000001 loop iterations

詳細な例については、「 タスク ベースの非同期プログラミング」を参照してください。

個別のタスクの作成と実行

Task クラスには、タスクを初期化するコンストラクターも用意されていますが、実行のスケジュールは設定しません。 パフォーマンス上の理由から、 Task.Run メソッドまたは TaskFactory.StartNew メソッドは、計算タスクを作成およびスケジュールするための推奨メカニズムですが、作成とスケジュールを分離する必要があるシナリオでは、コンストラクターを使用し、 Task.Start メソッドを呼び出して、後で実行するタスクをスケジュールできます。

タスクが完了するまで待つ

通常、タスクはスレッド プール スレッドで非同期的に実行されるため、タスクを作成して開始するスレッドは、タスクがインスタンス化されるとすぐに実行を続行します。 場合によっては、呼び出し元のスレッドがメイン アプリケーション スレッドの場合、タスクが実際に実行を開始する前にアプリが終了することがあります。 また、アプリケーションのロジックでは、1 つ以上のタスクの実行が完了した場合にのみ、呼び出し元のスレッドが実行を続行する必要がある場合があります。 Wait メソッドを呼び出して 1 つ以上のタスクが完了するまで待機することで、呼び出し元のスレッドの実行と起動する非同期タスクを同期できます。

1 つのタスクが完了するまで待機するには、その Task.Wait メソッドを呼び出します。 Wait メソッドの呼び出しは、1 つのクラス インスタンスの実行が完了するまで呼び出し元のスレッドをブロックします。

次の例では、パラメーターなしの Wait() メソッドを呼び出して、タスクが完了するまで無条件で待機します。 タスクは、 Thread.Sleep メソッドを呼び出して 2 秒間スリープ状態にすることで、作業をシミュレートします。

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

class Program
{
    static Random rand = new Random();

    static void Main()
    {
        // Wait on a single task with no timeout specified.
        Task taskA = Task.Run( () => Thread.Sleep(2000));
        Console.WriteLine("taskA Status: {0}", taskA.Status);
        try {
          taskA.Wait();
          Console.WriteLine("taskA Status: {0}", taskA.Status);
       } 
       catch (AggregateException) {
          Console.WriteLine("Exception in taskA.");
       }   
    }    
}
// The example displays output like the following:
//     taskA Status: WaitingToRun
//     taskA Status: RanToCompletion
open System
open System.Threading
open System.Threading.Tasks

let rand = Random()

// Wait on a single task with no timeout specified.
let taskA = Task.Run(fun () -> Thread.Sleep 2000)
printfn $"taskA Status: {taskA.Status}"
try 
    taskA.Wait()
    printfn $"taskA Status: {taskA.Status}"

with :? AggregateException ->
    printfn "Exception in taskA."

// The example displays output like the following:
//     taskA Status: WaitingToRun
//     taskA Status: RanToCompletion
Imports System.Threading
Imports System.Threading.Tasks

Module Example4
    Public Sub Main()
        ' Wait on a single task with no timeout specified.
        Dim taskA = Task.Run(Sub() Thread.Sleep(2000))
        Console.WriteLine("taskA Status: {0}", taskA.Status)
        Try
            taskA.Wait()
            Console.WriteLine("taskA Status: {0}", taskA.Status)
        Catch e As AggregateException
            Console.WriteLine("Exception in taskA.")
        End Try
    End Sub
End Module
' The example displays output like the following:
'     taskA Status: WaitingToRun
'     taskA Status: RanToCompletion

タスクが完了するまで条件付きで待機することもできます。 Wait(Int32)メソッドとWait(TimeSpan) メソッドは、タスクが完了するかタイムアウト間隔が経過するまで、呼び出し元のスレッドをブロックします。どちらか早い方です。 次の例では、2 秒間スリープしているが 1 秒のタイムアウト値を定義するタスクを起動するため、呼び出し元のスレッドは、タイムアウトの有効期限が切れるまで、タスクの実行が完了する前にブロックします。

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

public class Example
{
   public static void Main()
   {
      // Wait on a single task with a timeout specified.
      Task taskA = Task.Run( () => Thread.Sleep(2000));
      try {
        taskA.Wait(1000);       // Wait for 1 second.
        bool completed = taskA.IsCompleted;
        Console.WriteLine("Task A completed: {0}, Status: {1}",
                         completed, taskA.Status);
        if (!completed)
           Console.WriteLine("Timed out before task A completed.");                 
       }
       catch (AggregateException) {
          Console.WriteLine("Exception in taskA.");
       }   
   }
}
// The example displays output like the following:
//     Task A completed: False, Status: Running
//     Timed out before task A completed.
open System
open System.Threading
open System.Threading.Tasks

// Wait on a single task with a timeout specified.
let taskA = Task.Run(fun () -> Thread.Sleep 2000)

try
    taskA.Wait 1000 |> ignore // Wait for 1 second.
    let completed = taskA.IsCompleted
    printfn $"Task A completed: {completed}, Status: {taskA.Status}"

    if not completed then
        printfn "Timed out before task A completed."

with :? AggregateException ->
    printfn "Exception in taskA."


// The example displays output like the following:
//     Task A completed: False, Status: Running
//     Timed out before task A completed.
Imports System.Threading
Imports System.Threading.Tasks

Module Example5
    Public Sub Main()
        ' Wait on a single task with a timeout specified.
        Dim taskA As Task = Task.Run(Sub() Thread.Sleep(2000))
        Try
            taskA.Wait(1000)        ' Wait for 1 second.
            Dim completed As Boolean = taskA.IsCompleted
            Console.WriteLine("Task.Completed: {0}, Status: {1}",
                           completed, taskA.Status)
            If Not completed Then
                Console.WriteLine("Timed out before task A completed.")
            End If
        Catch e As AggregateException
            Console.WriteLine("Exception in taskA.")
        End Try
    End Sub
End Module
' The example displays the following output:
'     Task A completed: False, Status: Running
'     Timed out before task A completed.

Wait(CancellationToken)メソッドとWait(Int32, CancellationToken) メソッドを呼び出してキャンセル トークンを指定することもできます。 IsCancellationRequested メソッドの実行中にトークンのtrueプロパティがtrueまたはWaitになった場合、メソッドはOperationCanceledExceptionをスローします。

場合によっては、一連の実行中のタスクの最初の完了を待つ必要がありますが、それがどのタスクであるかは気にしないでください。 このためには、 Task.WaitAny メソッドのいずれかのオーバーロードを呼び出すことができます。 次の例では、3 つのタスクを作成し、それぞれが乱数ジェネレーターによって決定された間隔でスリープ状態になります。 WaitAny(Task[]) メソッドは、最初のタスクが完了するまで待機します。 次に、3 つのタスクの状態に関する情報を表示します。

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

public class Example
{
   public static void Main()
   {
      var tasks = new Task[3];
      var rnd = new Random();
      for (int ctr = 0; ctr <= 2; ctr++)
         tasks[ctr] = Task.Run( () => Thread.Sleep(rnd.Next(500, 3000)));

      try {
         int index = Task.WaitAny(tasks);
         Console.WriteLine("Task #{0} completed first.\n", tasks[index].Id);
         Console.WriteLine("Status of all tasks:");
         foreach (var t in tasks)
            Console.WriteLine("   Task #{0}: {1}", t.Id, t.Status);
      }
      catch (AggregateException) {
         Console.WriteLine("An exception occurred.");
      }
   }
}
// The example displays output like the following:
//     Task #1 completed first.
//     
//     Status of all tasks:
//        Task #3: Running
//        Task #1: RanToCompletion
//        Task #4: Running
open System
open System.Threading
open System.Threading.Tasks

let rnd = new Random()

let tasks =
    [| for _ = 0 to 2 do
           Task.Run(fun () -> rnd.Next(500, 3000) |> Thread.Sleep) |]

try
    let index = Task.WaitAny tasks
    printfn $"Task #{tasks[index].Id} completed first.\n"
    printfn "Status of all tasks:"

    for t in tasks do
        printfn $"   Task #{t.Id}: {t.Status}"

with :? AggregateException ->
    printfn "An exception occurred."

// The example displays output like the following:
//     Task #1 completed first.
//
//     Status of all tasks:
//        Task #3: Running
//        Task #1: RanToCompletion
//        Task #4: Running
Imports System.Threading
Imports System.Threading.Tasks

Module Example8
    Public Sub Main()
        Dim tasks(2) As Task
        Dim rnd As New Random()
        For ctr As Integer = 0 To 2
            tasks(ctr) = Task.Run(Sub() Thread.Sleep(rnd.Next(500, 3000)))
        Next

        Try
            Dim index As Integer = Task.WaitAny(tasks)
            Console.WriteLine("Task #{0} completed first.", tasks(index).Id)
            Console.WriteLine()
            Console.WriteLine("Status of all tasks:")
            For Each t In tasks
                Console.WriteLine("   Task #{0}: {1}", t.Id, t.Status)
            Next
        Catch e As AggregateException
            Console.WriteLine("An exception occurred.")
        End Try
    End Sub
End Module
' The example displays output like the following:
'     Task #1 completed first.
'
'     Status of all tasks:
'        Task #3: Running
'        Task #1: RanToCompletion
'        Task #4: Running

また、 WaitAll メソッドを呼び出すことによって、一連のタスクがすべて完了するのを待つこともできます。 次の例では、10 個のタスクを作成し、10 個すべてが完了するまで待機し、その状態を表示します。

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

public class Example
{
   public static void Main()
   {
      // Wait for all tasks to complete.
      Task[] tasks = new Task[10];
      for (int i = 0; i < 10; i++)
      {
          tasks[i] = Task.Run(() => Thread.Sleep(2000));
      }
      try {
         Task.WaitAll(tasks);
      }
      catch (AggregateException ae) {
         Console.WriteLine("One or more exceptions occurred: ");
         foreach (var ex in ae.Flatten().InnerExceptions)
            Console.WriteLine("   {0}", ex.Message);
      }   

      Console.WriteLine("Status of completed tasks:");
      foreach (var t in tasks)
         Console.WriteLine("   Task #{0}: {1}", t.Id, t.Status);
   }
}
// The example displays the following output:
//     Status of completed tasks:
//        Task #2: RanToCompletion
//        Task #1: RanToCompletion
//        Task #3: RanToCompletion
//        Task #4: RanToCompletion
//        Task #6: RanToCompletion
//        Task #5: RanToCompletion
//        Task #7: RanToCompletion
//        Task #8: RanToCompletion
//        Task #9: RanToCompletion
//        Task #10: RanToCompletion
open System
open System.Threading
open System.Threading.Tasks

// Wait for all tasks to complete.
let tasks =
    [| for _ = 0 to 9 do
           Task.Run(fun () -> Thread.Sleep 2000) |]

try
    Task.WaitAll tasks

with :? AggregateException as ae ->
    printfn "One or more exceptions occurred: "

    for ex in ae.Flatten().InnerExceptions do
        printfn $"   {ex.Message}"

printfn "Status of completed tasks:"

for t in tasks do
    printfn $"   Task #{t.Id}: {t.Status}"

// The example displays the following output:
//     Status of completed tasks:
//        Task #2: RanToCompletion
//        Task #1: RanToCompletion
//        Task #3: RanToCompletion
//        Task #4: RanToCompletion
//        Task #6: RanToCompletion
//        Task #5: RanToCompletion
//        Task #7: RanToCompletion
//        Task #8: RanToCompletion
//        Task #9: RanToCompletion
//        Task #10: RanToCompletion
Imports System.Threading
Imports System.Threading.Tasks

Module Example6
    Public Sub Main()
        ' Wait for all tasks to complete.
        Dim tasks(9) As Task
        For i As Integer = 0 To 9
            tasks(i) = Task.Run(Sub() Thread.Sleep(2000))
        Next
        Try
            Task.WaitAll(tasks)
        Catch ae As AggregateException
            Console.WriteLine("One or more exceptions occurred: ")
            For Each ex In ae.Flatten().InnerExceptions
                Console.WriteLine("   {0}", ex.Message)
            Next
        End Try

        Console.WriteLine("Status of completed tasks:")
        For Each t In tasks
            Console.WriteLine("   Task #{0}: {1}", t.Id, t.Status)
        Next
    End Sub
End Module
' The example displays the following output:
'     Status of completed tasks:
'        Task #2: RanToCompletion
'        Task #1: RanToCompletion
'        Task #3: RanToCompletion
'        Task #4: RanToCompletion
'        Task #6: RanToCompletion
'        Task #5: RanToCompletion
'        Task #7: RanToCompletion
'        Task #8: RanToCompletion
'        Task #9: RanToCompletion
'        Task #10: RanToCompletion

次の例に示すように、1 つ以上のタスクが完了するまで待機すると、実行中のタスクでスローされた例外は、 Wait メソッドを呼び出すスレッドに反映されることに注意してください。 12個のタスクが起動され、そのうち3つは正常に完了し、別の3つは例外が発生します。 残りの 6 つのタスクのうち、3 つのタスクは開始前に取り消され、3 つのタスクは実行中に取り消されます。 例外は、 WaitAll メソッド呼び出しでスローされ、 try/catch ブロックによって処理されます。

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

public class Example
{
   public static void Main()
   {
      // Create a cancellation token and cancel it.
      var source1 = new CancellationTokenSource();
      var token1 = source1.Token;
      source1.Cancel();
      // Create a cancellation token for later cancellation.
      var source2 = new CancellationTokenSource();
      var token2 = source2.Token;
       
      // Create a series of tasks that will complete, be cancelled, 
      // timeout, or throw an exception.
      Task[] tasks = new Task[12];
      for (int i = 0; i < 12; i++)
      {
          switch (i % 4) 
          {
             // Task should run to completion.
             case 0:
                tasks[i] = Task.Run(() => Thread.Sleep(2000));
                break;
             // Task should be set to canceled state.
             case 1:   
                tasks[i] = Task.Run( () => Thread.Sleep(2000),
                         token1);
                break;         
             case 2:
                // Task should throw an exception.
                tasks[i] = Task.Run( () => { throw new NotSupportedException(); } );
                break;
             case 3:
                // Task should examine cancellation token.
                tasks[i] = Task.Run( () => { Thread.Sleep(2000); 
                                             if (token2.IsCancellationRequested)
                                                token2.ThrowIfCancellationRequested();
                                             Thread.Sleep(500); }, token2);   
                break;
          }
      }
      Thread.Sleep(250);
      source2.Cancel();
       
      try {
         Task.WaitAll(tasks);
      }
      catch (AggregateException ae) {
          Console.WriteLine("One or more exceptions occurred:");
          foreach (var ex in ae.InnerExceptions)
             Console.WriteLine("   {0}: {1}", ex.GetType().Name, ex.Message);
       }   

      Console.WriteLine("\nStatus of tasks:");
      foreach (var t in tasks) {
         Console.WriteLine("   Task #{0}: {1}", t.Id, t.Status);
         if (t.Exception != null) {
            foreach (var ex in t.Exception.InnerExceptions)
               Console.WriteLine("      {0}: {1}", ex.GetType().Name,
                                 ex.Message);
         }
      }
   }
}
// The example displays output like the following:
//   One or more exceptions occurred:
//      TaskCanceledException: A task was canceled.
//      NotSupportedException: Specified method is not supported.
//      TaskCanceledException: A task was canceled.
//      TaskCanceledException: A task was canceled.
//      NotSupportedException: Specified method is not supported.
//      TaskCanceledException: A task was canceled.
//      TaskCanceledException: A task was canceled.
//      NotSupportedException: Specified method is not supported.
//      TaskCanceledException: A task was canceled.
//   
//   Status of tasks:
//      Task #13: RanToCompletion
//      Task #1: Canceled
//      Task #3: Faulted
//         NotSupportedException: Specified method is not supported.
//      Task #8: Canceled
//      Task #14: RanToCompletion
//      Task #4: Canceled
//      Task #6: Faulted
//         NotSupportedException: Specified method is not supported.
//      Task #7: Canceled
//      Task #15: RanToCompletion
//      Task #9: Canceled
//      Task #11: Faulted
//         NotSupportedException: Specified method is not supported.
//      Task #12: Canceled
open System
open System.Threading
open System.Threading.Tasks

// Create a cancellation token and cancel it.
let source1 = new CancellationTokenSource()
let token1 = source1.Token
source1.Cancel()
// Create a cancellation token for later cancellation.
let source2 = new CancellationTokenSource()
let token2 = source2.Token

// Create a series of tasks that will complete, be cancelled,
// timeout, or throw an exception.
let tasks =
    [| for i in 0..11 do
           match i % 4 with
           // Task should run to completion.
           | 0 -> Task.Run(fun () -> Thread.Sleep 2000)
           // Task should be set to canceled state.
           | 1 -> Task.Run(fun () -> Thread.Sleep 2000, token1)
           // Task should throw an exception.
           | 2 -> Task.Run(fun () -> NotSupportedException())
           // Task should examine cancellation token.
           | _ ->
               Task.Run(fun () ->
                   Thread.Sleep 2000

                   if token2.IsCancellationRequested then
                       token2.ThrowIfCancellationRequested()

                   Thread.Sleep 500, token2) |]


Thread.Sleep 250
source2.Cancel()

try
    Task.WaitAll tasks

with :? AggregateException as ae ->
    printfn "One or more exceptions occurred:"

    for ex in ae.InnerExceptions do
        printfn $"   {ex.GetType().Name}: {ex.Message}"

printfn "\nStatus of tasks:"

for t in tasks do
    printfn $"   Task #{t.Id}: {t.Status}"

    if isNull t.Exception |> not then
        for ex in t.Exception.InnerExceptions do
            printfn $"      {ex.GetType().Name}: {ex.Message}"

// The example displays output like the following:
//   One or more exceptions occurred:
//      TaskCanceledException: A task was canceled.
//      NotSupportedException: Specified method is not supported.
//      TaskCanceledException: A task was canceled.
//      TaskCanceledException: A task was canceled.
//      NotSupportedException: Specified method is not supported.
//      TaskCanceledException: A task was canceled.
//      TaskCanceledException: A task was canceled.
//      NotSupportedException: Specified method is not supported.
//      TaskCanceledException: A task was canceled.
//
//   Status of tasks:
//      Task #13: RanToCompletion
//      Task #1: Canceled
//      Task #3: Faulted
//         NotSupportedException: Specified method is not supported.
//      Task #8: Canceled
//      Task #14: RanToCompletion
//      Task #4: Canceled
//      Task #6: Faulted
//         NotSupportedException: Specified method is not supported.
//      Task #7: Canceled
//      Task #15: RanToCompletion
//      Task #9: Canceled
//      Task #11: Faulted
//         NotSupportedException: Specified method is not supported.
//      Task #12: Canceled
Imports System.Threading
Imports System.Threading.Tasks

Module Example7
    Public Sub Main()
        ' Create a cancellation token and cancel it.
        Dim source1 As New CancellationTokenSource()
        Dim token1 As CancellationToken = source1.Token
        source1.Cancel()
        ' Create a cancellation token for later cancellation.
        Dim source2 As New CancellationTokenSource()
        Dim token2 As CancellationToken = source2.Token

        ' Create a series of tasks that will complete, be cancelled, 
        ' timeout, or throw an exception.
        Dim tasks(11) As Task
        For i As Integer = 0 To 11
            Select Case i Mod 4
             ' Task should run to completion.
                Case 0
                    tasks(i) = Task.Run(Sub() Thread.Sleep(2000))
             ' Task should be set to canceled state.
                Case 1
                    tasks(i) = Task.Run(Sub() Thread.Sleep(2000), token1)
                Case 2
                    ' Task should throw an exception.
                    tasks(i) = Task.Run(Sub()
                                            Throw New NotSupportedException()
                                        End Sub)
                Case 3
                    ' Task should examine cancellation token.
                    tasks(i) = Task.Run(Sub()
                                            Thread.Sleep(2000)
                                            If token2.IsCancellationRequested Then
                                                token2.ThrowIfCancellationRequested()
                                            End If
                                            Thread.Sleep(500)
                                        End Sub, token2)
            End Select
        Next
        Thread.Sleep(250)
        source2.Cancel()

        Try
            Task.WaitAll(tasks)
        Catch ae As AggregateException
            Console.WriteLine("One or more exceptions occurred:")
            For Each ex In ae.InnerExceptions
                Console.WriteLine("   {0}: {1}", ex.GetType().Name, ex.Message)
            Next
        End Try
        Console.WriteLine()

        Console.WriteLine("Status of tasks:")
        For Each t In tasks
            Console.WriteLine("   Task #{0}: {1}", t.Id, t.Status)
            If t.Exception IsNot Nothing Then
                For Each ex In t.Exception.InnerExceptions
                    Console.WriteLine("      {0}: {1}", ex.GetType().Name,
                                 ex.Message)
                Next
            End If
        Next
    End Sub
End Module
' The example displays output like the following:
'   One or more exceptions occurred:
'      TaskCanceledException: A task was canceled.
'      NotSupportedException: Specified method is not supported.
'      TaskCanceledException: A task was canceled.
'      TaskCanceledException: A task was canceled.
'      NotSupportedException: Specified method is not supported.
'      TaskCanceledException: A task was canceled.
'      TaskCanceledException: A task was canceled.
'      NotSupportedException: Specified method is not supported.
'      TaskCanceledException: A task was canceled.
'   
'   Status of tasks:
'      Task #13: RanToCompletion
'      Task #1: Canceled
'      Task #3: Faulted
'         NotSupportedException: Specified method is not supported.
'      Task #8: Canceled
'      Task #14: RanToCompletion
'      Task #4: Canceled
'      Task #6: Faulted
'         NotSupportedException: Specified method is not supported.
'      Task #7: Canceled
'      Task #15: RanToCompletion
'      Task #9: Canceled
'      Task #11: Faulted
'         NotSupportedException: Specified method is not supported.
'      Task #12: Canceled

タスク ベースの非同期操作での例外処理の詳細については、「 例外処理」を参照してください。

タスクとカルチャ

.NET Framework 4.6 を対象とするデスクトップ アプリ以降では、タスクを作成して呼び出すスレッドのカルチャがスレッドのコンテキストの一部になります。 つまり、タスクが実行されるスレッドの現在のカルチャに関係なく、タスクの現在のカルチャは呼び出し元スレッドのカルチャです。 .NET Framework 4.6 より前のバージョンの .NET Framework を対象とするアプリの場合、タスクのカルチャは、タスクが実行されるスレッドのカルチャです。 詳細については、 CultureInfo トピックの「カルチャとタスクベースの非同期操作」セクションを参照してください。

Note

ストア アプリは、既定のカルチャの設定と取得において Windows ランタイムに従います。

デバッガー開発者向け

カスタム デバッガーを実装する開発者には、タスクの内部メンバーとプライベート メンバーがいくつか役立つ場合があります (これらはリリースからリリースに変更される可能性があります)。 m_taskId フィールドは、Id プロパティのバッキング ストアとして機能しますが、デバッガーからこのフィールドに直接アクセスする方が、プロパティの getter メソッドを使用して同じ値にアクセスするよりも効率的な場合があります (s_taskIdCounter カウンターは、タスクで次に使用可能な ID を取得するために使用されます)。 同様に、 m_stateFlags フィールドには、タスクの現在のライフサイクル ステージに関する情報が格納されます。情報には、 Status プロパティを介してアクセスすることもできます。 m_action フィールドにはタスクのデリゲートへの参照が格納され、m_stateObject フィールドには開発者によってタスクに渡された非同期状態が格納されます。 最後に、スタック フレームを解析するデバッガーの場合、 InternalWait メソッドは、タスクが待機操作に入ったときの潜在的なマーカーを提供します。

コンストラクター

名前 説明
Task(Action, CancellationToken, TaskCreationOptions)

指定したアクションと作成オプションを使用して、新しい Task を初期化します。

Task(Action, CancellationToken)

指定したアクションとTaskを使用して、新しいCancellationTokenを初期化します。

Task(Action, TaskCreationOptions)

指定したアクションと作成オプションを使用して、新しい Task を初期化します。

Task(Action)

指定したアクションを使用して、新しい Task を初期化します。

Task(Action<Object>, Object, CancellationToken, TaskCreationOptions)

指定したアクション、状態、およびオプションを使用して、新しい Task を初期化します。

Task(Action<Object>, Object, CancellationToken)

指定したアクション、状態、およびTaskを使用して、新しいCancellationTokenを初期化します。

Task(Action<Object>, Object, TaskCreationOptions)

指定したアクション、状態、およびオプションを使用して、新しい Task を初期化します。

Task(Action<Object>, Object)

指定したアクションと状態で新しい Task を初期化します。

プロパティ

名前 説明
AsyncState

Taskの作成時に指定された状態オブジェクトを取得します。指定されていない場合は null を取得します。

CompletedTask

既に正常に完了したタスクを取得します。

CreationOptions

このタスクの作成に使用する TaskCreationOptions を取得します。

CurrentId

現在実行中の Taskの ID を返します。

Exception

AggregateExceptionが途中で終了する原因となったTaskを取得します。 Taskが正常に完了した場合、またはまだ例外がスローされていない場合は、nullが返されます。

Factory

TaskインスタンスとTask<TResult>インスタンスを作成および構成するためのファクトリ メソッドへのアクセスを提供します。

Id

この Task インスタンスの ID を取得します。

IsCanceled

この Task インスタンスが取り消されたために実行を完了したかどうかを取得します。

IsCompleted

タスクが完了したかどうかを示す値を取得します。

IsCompletedSuccessfully

タスクが完了まで実行されたかどうかを取得します。

IsFaulted

ハンドルされない例外が原因で Task が完了したかどうかを取得します。

Status

このタスクの TaskStatus を取得します。

メソッド

名前 説明
ConfigureAwait(Boolean)

この Taskを待機するために使用する awaiter を構成します。

ConfigureAwait(ConfigureAwaitOptions)

この Taskを待機するために使用する awaiter を構成します。

ContinueWith(Action<Task,Object>, Object, CancellationToken, TaskContinuationOptions, TaskScheduler)

呼び出し元が指定した状態情報とキャンセル トークンを受け取り、ターゲット Task が完了したときに実行される継続を作成します。 継続は、指定された一連の条件に基づいて実行され、指定されたスケジューラを使用します。

ContinueWith(Action<Task,Object>, Object, CancellationToken)

呼び出し元が指定した状態情報とキャンセル トークンを受け取り、ターゲット Task が完了したときに非同期的に実行される継続を作成します。

ContinueWith(Action<Task,Object>, Object, TaskContinuationOptions)

呼び出し元が指定した状態情報を受け取り、ターゲット Task が完了したときに実行される継続を作成します。 継続は、指定された一連の条件に基づいて実行されます。

ContinueWith(Action<Task,Object>, Object, TaskScheduler)

呼び出し元が指定した状態情報を受け取り、ターゲット Task が完了したときに非同期的に実行される継続を作成します。 継続では、指定されたスケジューラが使用されます。

ContinueWith(Action<Task,Object>, Object)

呼び出し元が指定した状態情報を受け取り、ターゲット Task が完了したときに実行される継続を作成します。

ContinueWith(Action<Task>, CancellationToken, TaskContinuationOptions, TaskScheduler)

指定した TaskContinuationOptionsに従ってターゲット タスクが競合したときに実行される継続を作成します。 継続はキャンセル トークンを受け取り、指定されたスケジューラを使用します。

ContinueWith(Action<Task>, CancellationToken)

キャンセル トークンを受け取り、ターゲット Task が完了したときに非同期的に実行される継続を作成します。

ContinueWith(Action<Task>, TaskContinuationOptions)

指定した TaskContinuationOptionsに従って、ターゲット タスクが完了したときに実行される継続を作成します。

ContinueWith(Action<Task>, TaskScheduler)

ターゲット Task が完了したときに非同期的に実行される継続を作成します。 継続では、指定されたスケジューラが使用されます。

ContinueWith(Action<Task>)

ターゲット Task が完了したときに非同期的に実行される継続を作成します。

ContinueWith<TResult>(Func<Task,Object,TResult>, Object, CancellationToken, TaskContinuationOptions, TaskScheduler)

ターゲット Task が完了して値を返したときに、指定したタスク継続オプションに基づいて実行される継続を作成します。 継続は、呼び出し元が指定した状態情報とキャンセル トークンを受け取り、指定されたスケジューラを使用します。

ContinueWith<TResult>(Func<Task,Object,TResult>, Object, CancellationToken)

ターゲット Task が完了し、値を返すときに非同期的に実行される継続を作成します。 継続は、呼び出し元が指定した状態情報とキャンセル トークンを受け取ります。

ContinueWith<TResult>(Func<Task,Object,TResult>, Object, TaskContinuationOptions)

ターゲット Task が完了したときに、指定したタスク継続オプションに基づいて実行される継続を作成します。 継続は、呼び出し元が指定した状態情報を受け取ります。

ContinueWith<TResult>(Func<Task,Object,TResult>, Object, TaskScheduler)

ターゲット Task が完了したときに非同期的に実行される継続を作成します。 継続は呼び出し元が指定した状態情報を受け取り、指定されたスケジューラを使用します。

ContinueWith<TResult>(Func<Task,Object,TResult>, Object)

呼び出し元が指定した状態情報を受け取り、ターゲット Task が完了して値を返したときに非同期的に実行される継続を作成します。

ContinueWith<TResult>(Func<Task,TResult>, CancellationToken, TaskContinuationOptions, TaskScheduler)

指定した継続オプションに従って実行される継続を作成し、値を返します。 継続はキャンセル トークンを渡され、指定されたスケジューラを使用します。

ContinueWith<TResult>(Func<Task,TResult>, CancellationToken)

ターゲット Task が完了し、値を返すときに非同期的に実行される継続を作成します。 継続はキャンセル トークンを受け取ります。

ContinueWith<TResult>(Func<Task,TResult>, TaskContinuationOptions)

指定した継続オプションに従って実行される継続を作成し、値を返します。

ContinueWith<TResult>(Func<Task,TResult>, TaskScheduler)

ターゲット Task が完了し、値を返すときに非同期的に実行される継続を作成します。 継続では、指定されたスケジューラが使用されます。

ContinueWith<TResult>(Func<Task,TResult>)

ターゲット Task<TResult> が完了し、値を返すときに非同期的に実行される継続を作成します。

Delay(Int32, CancellationToken)

指定したミリ秒後に完了する取り消し可能なタスクを作成します。

Delay(Int32)

指定したミリ秒後に完了するタスクを作成します。

Delay(TimeSpan, CancellationToken)

指定した時間間隔後に完了する取り消し可能なタスクを作成します。

Delay(TimeSpan, TimeProvider, CancellationToken)

指定した時間間隔後に完了する取り消し可能なタスクを作成します。

Delay(TimeSpan, TimeProvider)

指定した時間間隔後に完了するタスクを作成します。

Delay(TimeSpan)

指定した時間間隔後に完了するタスクを作成します。

Dispose()

Task クラスの現在のインスタンスで使用されているすべてのリソースを解放します。

Dispose(Boolean)

Taskを破棄し、すべてのアンマネージ リソースを解放します。

Equals(Object)

指定したオブジェクトが現在のオブジェクトと等しいかどうかを判断します。

(継承元 Object)
FromCanceled(CancellationToken)

指定したキャンセル トークンによる取り消しにより完了した Task を作成します。

FromCanceled<TResult>(CancellationToken)

指定したキャンセル トークンによる取り消しにより完了した Task<TResult> を作成します。

FromException(Exception)

指定した例外で完了した Task を作成します。

FromException<TResult>(Exception)

指定した例外で完了した Task<TResult> を作成します。

FromResult<TResult>(TResult)

指定した結果で正常に完了した Task<TResult> を作成します。

GetAwaiter()

この Taskを待機するために使用する awaiter を取得します。

GetHashCode()

既定のハッシュ関数として機能します。

(継承元 Object)
GetType()

現在のインスタンスの Type を取得します。

(継承元 Object)
MemberwiseClone()

現在の Objectの簡易コピーを作成します。

(継承元 Object)
Run(Action, CancellationToken)

スレッド プールで実行する指定された作業をキューに入れ、その作業を表す Task オブジェクトを返します。 取り消しトークンを使用すると、まだ開始されていない場合に作業を取り消すことができます。

Run(Action)

スレッド プールで実行する指定された作業をキューに入れ、その作業を表す Task オブジェクトを返します。

Run(Func<Task>, CancellationToken)

スレッド プールで実行する指定された作業をキューに入れ、 functionによって返されたタスクのプロキシを返します。 取り消しトークンを使用すると、まだ開始されていない場合に作業を取り消すことができます。

Run(Func<Task>)

スレッド プールで実行する指定された作業をキューに入れ、 functionによって返されたタスクのプロキシを返します。

Run<TResult>(Func<Task<TResult>>, CancellationToken)

スレッド プールで実行する指定された作業をキューに入れ、Task(TResult)によって返されるfunctionのプロキシを返します。

Run<TResult>(Func<Task<TResult>>)

スレッド プールで実行する指定された作業をキューに入れ、Task(TResult)によって返されるfunctionのプロキシを返します。 取り消しトークンを使用すると、まだ開始されていない場合に作業を取り消すことができます。

Run<TResult>(Func<TResult>, CancellationToken)

スレッド プールで実行する指定された作業をキューに入れ、その作業を表す Task(TResult) オブジェクトを返します。

Run<TResult>(Func<TResult>)

スレッド プールで実行する指定された作業をキューに入れ、その作業を表す Task<TResult> オブジェクトを返します。 取り消しトークンを使用すると、まだ開始されていない場合に作業を取り消すことができます。

RunSynchronously()

現在のTaskTaskSchedulerを同期的に実行します。

RunSynchronously(TaskScheduler)

指定されたTaskTaskSchedulerを同期的に実行します。

Start()

Taskを開始し、現在のTaskSchedulerへの実行をスケジュールします。

Start(TaskScheduler)

Taskを開始し、指定したTaskSchedulerに実行するようにスケジュールします。

ToString()

現在のオブジェクトを表す文字列を返します。

(継承元 Object)
Wait()

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

Wait(CancellationToken)

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

Wait(Int32, CancellationToken)

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

Wait(Int32)

指定したミリ秒以内に Task の実行が完了するまで待機します。

Wait(TimeSpan, CancellationToken)

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

Wait(TimeSpan)

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

WaitAll(IEnumerable<Task>, CancellationToken)

待機が取り消されない限り、指定されたすべての Task オブジェクトの実行が完了するまで待機します。

WaitAll(ReadOnlySpan<Task>)

指定されたすべての Task オブジェクトの実行が完了するまで待機します。

WaitAll(Task[], CancellationToken)

待機が取り消されない限り、指定されたすべての Task オブジェクトの実行が完了するまで待機します。

WaitAll(Task[], Int32, CancellationToken)

指定されたすべての Task オブジェクトが、指定したミリ秒以内に実行を完了するまで、または待機が取り消されるまで待機します。

WaitAll(Task[], Int32)

指定されたすべての Task オブジェクトが、指定したミリ秒以内に実行を完了するまで待機します。

WaitAll(Task[], TimeSpan)

指定した時間内に、指定されたすべての取り消し可能な Task オブジェクトの実行が完了するまで待機します。

WaitAll(Task[])

指定されたすべての Task オブジェクトの実行が完了するまで待機します。

WaitAny(Task[], CancellationToken)

待機が取り消されない限り、指定された Task オブジェクトのいずれかが実行を完了するまで待機します。

WaitAny(Task[], Int32, CancellationToken)

指定した Task オブジェクトが指定したミリ秒以内に実行を完了するか、キャンセル トークンが取り消されるまで待機します。

WaitAny(Task[], Int32)

指定した Task オブジェクトのいずれかが、指定したミリ秒以内に実行を完了するまで待機します。

WaitAny(Task[], TimeSpan)

指定した Task オブジェクトのいずれかが、指定した時間間隔内で実行を完了するまで待機します。

WaitAny(Task[])

指定された Task オブジェクトのいずれかが実行を完了するまで待機します。

WaitAsync(CancellationToken)

このTaskが完了したとき、または指定したTaskがキャンセル要求されたときに完了するCancellationTokenを取得します。

WaitAsync(TimeSpan, CancellationToken)

このTaskが完了したとき、指定したタイムアウトが期限切れになったとき、または指定したTaskがキャンセル要求されたときに完了するCancellationTokenを取得します。

WaitAsync(TimeSpan, TimeProvider, CancellationToken)

このTaskが完了したとき、指定したタイムアウトが期限切れになったとき、または指定したTaskがキャンセル要求されたときに完了するCancellationTokenを取得します。

WaitAsync(TimeSpan, TimeProvider)

このTaskが完了したとき、または指定したタイムアウトの有効期限が切れたときに完了するTaskを取得します。

WaitAsync(TimeSpan)

このTaskが完了したとき、または指定したタイムアウトの有効期限が切れたときに完了するTaskを取得します。

WhenAll(IEnumerable<Task>)

列挙可能なコレクション内のすべての Task オブジェクトが完了したときに完了するタスクを作成します。

WhenAll(ReadOnlySpan<Task>)

指定されたすべてのタスクが完了したときに完了するタスクを作成します。

WhenAll(Task[])

配列内のすべての Task オブジェクトが完了したときに完了するタスクを作成します。

WhenAll<TResult>(IEnumerable<Task<TResult>>)

列挙可能なコレクション内のすべての Task<TResult> オブジェクトが完了したときに完了するタスクを作成します。

WhenAll<TResult>(ReadOnlySpan<Task<TResult>>)

指定されたすべてのタスクが完了したときに完了するタスクを作成します。

WhenAll<TResult>(Task<TResult>[])

配列内のすべての Task<TResult> オブジェクトが完了したときに完了するタスクを作成します。

WhenAny(IEnumerable<Task>)

指定されたタスクのいずれかが完了したときに完了するタスクを作成します。

WhenAny(ReadOnlySpan<Task>)

指定されたタスクのいずれかが完了したときに完了するタスクを作成します。

WhenAny(Task, Task)

指定されたタスクのいずれかが完了したときに完了するタスクを作成します。

WhenAny(Task[])

指定されたタスクのいずれかが完了したときに完了するタスクを作成します。

WhenAny<TResult>(IEnumerable<Task<TResult>>)

指定されたタスクのいずれかが完了したときに完了するタスクを作成します。

WhenAny<TResult>(ReadOnlySpan<Task<TResult>>)

指定されたタスクのいずれかが完了したときに完了するタスクを作成します。

WhenAny<TResult>(Task<TResult>, Task<TResult>)

指定されたタスクのいずれかが完了したときに完了するタスクを作成します。

WhenAny<TResult>(Task<TResult>[])

指定されたタスクのいずれかが完了したときに完了するタスクを作成します。

WhenEach(IEnumerable<Task>)

これらのタスクの完了時に指定されたタスクを生成する IAsyncEnumerable<T> を作成します。

WhenEach(ReadOnlySpan<Task>)

これらのタスクの完了時に指定されたタスクを生成する IAsyncEnumerable<T> を作成します。

WhenEach(Task[])

これらのタスクの完了時に指定されたタスクを生成する IAsyncEnumerable<T> を作成します。

WhenEach<TResult>(IEnumerable<Task<TResult>>)

これらのタスクの完了時に指定されたタスクを生成する IAsyncEnumerable<T> を作成します。

WhenEach<TResult>(ReadOnlySpan<Task<TResult>>)

これらのタスクの完了時に指定されたタスクを生成する IAsyncEnumerable<T> を作成します。

WhenEach<TResult>(Task<TResult>[])

これらのタスクの完了時に指定されたタスクを生成する IAsyncEnumerable<T> を作成します。

Yield()

待機時に現在のコンテキストに非同期的に戻す待機可能なタスクを作成します。

明示的なインターフェイスの実装

名前 説明
IAsyncResult.AsyncWaitHandle

タスクの完了を待機するために使用できる WaitHandle を取得します。

IAsyncResult.CompletedSynchronously

操作が同期的に完了したかどうかを示す値を取得します。

拡張メソッド

名前 説明
AsAsyncAction(Task)

開始されたタスクを表す Windows ランタイム非同期アクションを返します。

DispatcherOperationWait(Task, TimeSpan)

基になる DispatcherOperation が完了するまで、指定した時間待機します。

DispatcherOperationWait(Task)

基になる DispatcherOperation が完了するまで無期限に待機します。

IsDispatcherOperationTask(Task)

この TaskDispatcherOperationに関連付けられているかどうかを示す値を返します。

適用対象

スレッド セーフ

Taskを除く、Dispose()のすべてのメンバーはスレッド セーフであり、複数のスレッドから同時に使用できます。

こちらもご覧ください