Task<TResult> クラス
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
値を返すことができる非同期操作を表します。
generic <typename TResult>
public ref class Task : System::Threading::Tasks::Task
public class Task<TResult> : System.Threading.Tasks.Task
type Task<'Result> = class
inherit Task
Public Class Task(Of TResult)
Inherits Task
型パラメーター
- TResult
この Task<TResult>によって生成される結果の型。
- 継承
注釈
Task<TResult> クラスは、値を返し、通常は非同期的に実行される 1 つの操作を表します。
Task<TResult> インスタンスは、さまざまな方法で作成できます。 .NET Framework 4.5 以降で使用できる最も一般的な方法は、静的な Task.Run<TResult>(Func<TResult>) または Task.Run<TResult>(Func<TResult>, CancellationToken) メソッドを呼び出す方法です。 これらのメソッドは、既定値を使用し、追加のパラメーターを取得せずにタスクを開始する簡単な方法を提供します。 次の例では、Task.Run<TResult>(Func<TResult>) メソッドを使用して、ループするタスクを開始し、ループイテレーションの数を表示します。
using System;
using System.Threading.Tasks;
public class Example
{
public static void Main()
{
var t = Task<int>.Run( () => {
// Just loop.
int max = 1000000;
int ctr = 0;
for (ctr = 0; ctr <= max; ctr++) {
if (ctr == max / 2 && DateTime.Now.Hour <= 12) {
ctr++;
break;
}
}
return ctr;
} );
Console.WriteLine("Finished {0:N0} iterations.", t.Result);
}
}
// The example displays output like the following:
// Finished 1,000,001 loop iterations.
Imports System.Threading.Tasks
Module Example
Public Sub Main()
Dim t As Task(Of Integer) = Task.Run(Function()
Dim max As Integer = 1000000
Dim ctr As Integer
For ctr = 0 to max
If ctr = max \ 2 And Date.Now.Hour <= 12 Then
ctr += 1
Exit For
End If
Next
Return ctr
End Function)
Console.WriteLine("Finished {0:N0} iterations.", t.Result)
End Sub
End Module
' The example displays the following output:
' Finished 1,000,001 loop iterations
代わりに、.NET Framework 4 でタスクを開始する最も一般的な方法は、静的な TaskFactory.StartNew または TaskFactory<TResult>.StartNew メソッドを呼び出す方法です。
Task.Factory プロパティは TaskFactory オブジェクトを返し、Task<TResult>.Factory プロパティは TaskFactory<TResult> オブジェクトを返します。
StartNew
メソッドのオーバーロードを使用すると、引数の渡し、タスク作成オプションの定義、タスク スケジューラの指定を行えます。 次の例では、TaskFactory<TResult>.StartNew(Func<TResult>) メソッドを使用してタスクを開始します。 これは、前の例のコードと機能的に同等です。
using System;
using System.Threading.Tasks;
public class Example
{
public static void Main()
{
var t = Task<int>.Factory.StartNew( () => {
// Just loop.
int max = 1000000;
int ctr = 0;
for (ctr = 0; ctr <= max; ctr++) {
if (ctr == max / 2 && DateTime.Now.Hour <= 12) {
ctr++;
break;
}
}
return ctr;
} );
Console.WriteLine("Finished {0:N0} iterations.", t.Result);
}
}
// The example displays the following output:
// Finished 1000001 loop iterations
Imports System.Threading.Tasks
Module Example
Public Sub Main()
Dim t = Task(Of Integer).Factory.StartNew(Function()
Dim max As Integer = 1000000
Dim ctr As Integer
For ctr = 0 to max
If ctr = max \ 2 And Date.Now.Hour <= 12 Then
ctr += 1
Exit For
End If
Next
Return ctr
End Function)
Console.WriteLine("Finished {0:N0} iterations.", t.Result)
End Sub
End Module
' The example displays output like the following:
' Finished 1,000,001 iterations
詳細な例については、「タスク ベースの非同期プログラミング
Task<TResult> クラスには、タスクを初期化するコンストラクターも用意されていますが、実行のスケジュールは設定しません。 パフォーマンス上の理由から、Task.Run メソッドと Task.Factory.StartNew
メソッドは計算タスクを作成およびスケジュールするための推奨メカニズムですが、タスクの作成とスケジュールを分離する必要があるシナリオでは、コンストラクターを使用し、タスクの Start メソッドを使用して、後で実行するタスクをスケジュールすることができます。
.NET Framework 4.6 を対象とするデスクトップ アプリ以降では、タスクを作成して呼び出すスレッドのカルチャがスレッドのコンテキストの一部になります。 つまり、タスクが実行されるスレッドの現在のカルチャに関係なく、タスクの現在のカルチャは呼び出し元スレッドのカルチャです。 .NET Framework 4.6 より前のバージョンの .NET Framework を対象とするアプリの場合、タスクのカルチャは、タスクが実行されるスレッドのカルチャです。 詳細については、CultureInfo トピックの「カルチャとタスクベースの非同期操作」セクションを参照してください。 ストア アプリは、既定のカルチャを設定して取得する際に Windows ランタイムに従います。
値を返さない操作の場合は、Task クラスを使用します。 C# 7.0 以降では、参照型ではなく値型であるより軽量なタスクでは、System.Threading.Tasks.ValueTask<TResult> 構造体を使用します。
コンストラクター
Task<TResult>(Func<Object,TResult>, Object) |
指定した関数と状態で新しい Task<TResult> を初期化します。 |
Task<TResult>(Func<Object,TResult>, Object, CancellationToken) |
指定したアクション、状態、およびオプションを使用して、新しい Task<TResult> を初期化します。 |
Task<TResult>(Func<Object,TResult>, Object, CancellationToken, TaskCreationOptions) |
指定したアクション、状態、およびオプションを使用して、新しい Task<TResult> を初期化します。 |
Task<TResult>(Func<Object,TResult>, Object, TaskCreationOptions) |
指定したアクション、状態、およびオプションを使用して、新しい Task<TResult> を初期化します。 |
Task<TResult>(Func<TResult>) |
指定した関数を使用して新しい Task<TResult> を初期化します。 |
Task<TResult>(Func<TResult>, CancellationToken) |
指定した関数を使用して新しい Task<TResult> を初期化します。 |
Task<TResult>(Func<TResult>, CancellationToken, TaskCreationOptions) |
指定した関数と作成オプションを使用して、新しい Task<TResult> を初期化します。 |
Task<TResult>(Func<TResult>, TaskCreationOptions) |
指定した関数と作成オプションを使用して、新しい Task<TResult> を初期化します。 |
プロパティ
AsyncState |
Task の作成時に指定された状態オブジェクトを取得します。指定されていない場合は null を取得します。 (継承元 Task) |
CreationOptions |
このタスクの作成に使用する TaskCreationOptions を取得します。 (継承元 Task) |
Exception |
Task が途中で終了する原因となった AggregateException を取得します。
Task が正常に完了した場合、またはまだ例外がスローされていない場合は、 |
Factory |
Task<TResult> インスタンスを作成および構成するためのファクトリ メソッドを取得します。 |
Id |
この Task インスタンスの ID を取得します。 (継承元 Task) |
IsCanceled |
この Task インスタンスが取り消されたために実行を完了したかどうかを取得します。 (継承元 Task) |
IsCompleted |
タスクが完了したかどうかを示す値を取得します。 (継承元 Task) |
IsCompletedSuccessfully |
タスクが完了まで実行されたかどうかを取得します。 (継承元 Task) |
IsFaulted |
ハンドルされない例外が原因で Task が完了したかどうかを取得します。 (継承元 Task) |
Result |
この Task<TResult>の結果値を取得します。 |
Status |
このタスクの TaskStatus を取得します。 (継承元 Task) |
メソッド
明示的なインターフェイスの実装
IAsyncResult.AsyncWaitHandle |
タスクの完了を待機するために使用できる WaitHandle を取得します。 (継承元 Task) |
IAsyncResult.CompletedSynchronously |
操作が同期的に完了したかどうかを示す値を取得します。 (継承元 Task) |
拡張メソッド
WaitAsync(Task, TimeSpan, TimeProvider, CancellationToken) |
この Task が完了したとき、指定したタイムアウトが経過したとき、または指定した CancellationToken が取り消しを要求したときに完了する Task を取得します。 |
WaitAsync<TResult>(Task<TResult>, TimeSpan, TimeProvider, CancellationToken) |
この Task が完了したとき、指定したタイムアウトが経過したとき、または指定した CancellationToken が取り消しを要求したときに完了する Task を取得します。 |
DispatcherOperationWait(Task) |
基になる DispatcherOperation が完了するまで無期限に待機します。 |
DispatcherOperationWait(Task, TimeSpan) |
基になる DispatcherOperation が完了するまで、指定した時間待機します。 |
IsDispatcherOperationTask(Task) |
この Task が DispatcherOperationに関連付けられているかどうかを示す値を返します。 |
AsAsyncAction(Task) |
開始されたタスクを表す Windows ランタイム非同期アクションを返します。 |
AsAsyncOperation<TResult>(Task<TResult>) |
結果を返す開始タスクを表す Windows ランタイム非同期操作を返します。 |
適用対象
スレッド セーフ
Dispose()を除く、Task<TResult>のすべてのメンバーはスレッド セーフであり、複数のスレッドから同時に使用できます。
こちらもご覧ください
- Task
- タスク並列ライブラリ (TPL)
- タスク ベースの非同期プログラミング の
- .NET Core および .NET Standard を使用した並列プログラミングの
サンプル
.NET