TaskFactory<TResult> クラス
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
Task<TResult> オブジェクトを作成およびスケジュールするためのサポートを提供します。
generic <typename TResult>
public ref class TaskFactory
public class TaskFactory<TResult>
type TaskFactory<'Result> = class
Public Class TaskFactory(Of TResult)
型パラメーター
- TResult
このクラスのメソッドによって作成される Task<TResult> オブジェクトの戻り値。
- 継承
-
TaskFactory<TResult>
例
次の例では、静的 Factory プロパティを使用して、メソッドを TaskFactory<TResult>.StartNew 2 回呼び出します。 最初のタスクは、ユーザーの MyDocuments ディレクトリ内のファイルの名前が設定された文字列配列を返します。2 番目のタスクは、ユーザーの MyDocuments ディレクトリのサブディレクトリの名前が設定された文字列配列を返します。 次に、メソッドを TaskFactory.ContinueWhenAll(Task[], Action<Task[]>) 呼び出します。このメソッドは、実行が完了した後に 2 つのタスクによって返される配列内のファイルとディレクトリの数に関する情報を表示します。
using System;
using System.IO;
using System.Threading.Tasks;
public class Example
{
public static void Main()
{
Task<string[]>[] tasks = new Task<string[]>[2];
String docsDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
tasks[0] = Task<string[]>.Factory.StartNew( () => Directory.GetFiles(docsDirectory));
tasks[1] = Task<string[]>.Factory.StartNew( () => Directory.GetDirectories(docsDirectory));
Task.Factory.ContinueWhenAll(tasks, completedTasks => {
Console.WriteLine("{0} contains: ", docsDirectory);
Console.WriteLine(" {0} subdirectories", tasks[1].Result.Length);
Console.WriteLine(" {0} files", tasks[0].Result.Length);
} );
}
}
// The example displays output like the following:
// C:\Users\<username>\Documents contains:
// 24 subdirectories
// 16 files
Imports System.IO
Imports System.Threading.Tasks
Module Example
Public Sub Main()
Dim tasks(1) As Task(Of String())
Dim docsDirectory As String = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
tasks(0) = Task(Of String()).Factory.StartNew( Function()Directory.GetFiles(docsDirectory) )
'' End Sub )
tasks(1) = Task(Of String()).Factory.StartNew( Function() Directory.GetDirectories(docsDirectory) )
'' End Sub )
Task.Factory.ContinueWhenAll(tasks, Sub(completedTasks)
Console.WriteLine("{0} contains: ", docsDirectory)
Console.WriteLine(" {0} subdirectories", tasks(1).Result.Length)
Console.WriteLine(" {0} files", tasks(0).Result.Length)
End Sub)
End Sub
End Module
' The example displays output like the following:
' C:\Users\<username>\Documents contains:
' 24 subdirectories
' 16 files
注釈
.NET には、タスクを作成およびスケジュールするための 2 つのファクトリが用意されています。
作成TaskFactoryおよびTask<TResult>オブジェクトを作成Taskするクラス。
TaskFactory<TResult>オブジェクトを作成Task<TResult>するクラス。
この TaskFactory<TResult> クラスを使用すると、次の操作を実行できます。
タスクを作成し、メソッドを呼び出 StartNew してすぐに開始します。 このメソッドのオーバーロードを呼び出して、既定以外の引数を必要とするタスクを作成して実行できます。
警告
.NET Framework 4.5 以降では、既定の構成値を使用してタスクを作成し、Task.Runすぐに開始する最も簡単な方法が提供されます。
配列内のいずれかのタスクが完了したときに開始するタスクを作成するには、or ContinueWhenAny メソッドをContinueWhenAny呼び出します。
配列内のすべてのタスクが完了したときに開始するタスクを作成するには、or ContinueWhenAll メソッドをContinueWhenAll呼び出します。
静的 Task<TResult>.Factory プロパティは、既定 TaskFactory<TResult> のオブジェクトを返します。 クラス コンストラクターのいずれかを TaskFactory<TResult> 呼び出して、クラスが作成する Task<TResult> オブジェクトを TaskFactory<TResult> 構成することもできます。 次の例では、キャンセル トークン、タスク作成オプション、継続オプション、およびカスタマイズされたタスク スケジューラを持つタスクを作成するように、新しい TaskFactory<TResult> オブジェクトを構成します。
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
public class Example
{
static CancellationTokenSource cts = new CancellationTokenSource();
static TaskFactory<int> factory = new TaskFactory<int>(
cts.Token,
TaskCreationOptions.PreferFairness,
TaskContinuationOptions.ExecuteSynchronously,
new CustomScheduler());
static void Main()
{
var t2 = factory.StartNew(() => DoWork());
cts.Dispose();
}
static int DoWork()
{
/*...*/
return DateTime.Now.Hour <= 12 ? 1 : 2;
}
}
Imports System.Collections.Generic
Imports System.Threading
Imports System.Threading.Tasks
Module Example
Public Sub Main()
Dim cts As New CancellationTokenSource()
Dim factory As New TaskFactory(Of Integer)(
cts.Token,
TaskCreationOptions.PreferFairness,
TaskContinuationOptions.ExecuteSynchronously,
New CustomScheduler())
Dim t2 = factory.StartNew(Function() DoWork())
cts.Dispose()
End Sub
Function DoWork() As Integer
Return If(Date.Now.Hour <= 12, 1, 2)
End Function
End Module
ほとんどの場合、新しい TaskFactory<TResult> インスタンスをインスタンス化する必要はありません。 代わりに、既定値を使用するファクトリ オブジェクトを返す静的 Task<TResult>.Factory プロパティを使用できます。 その後、そのメソッドを呼び出して新しいタスクを開始したり、タスクの継続を定義したりできます。 図については、例を参照してください。
コンストラクター
TaskFactory<TResult>() |
既定の構成を使用して、TaskFactory<TResult> インスタンスを初期化します。 |
TaskFactory<TResult>(CancellationToken) |
既定の構成を使用して、TaskFactory<TResult> インスタンスを初期化します。 |
TaskFactory<TResult>(CancellationToken, TaskCreationOptions, TaskContinuationOptions, TaskScheduler) |
指定された構成を使用して、TaskFactory<TResult> インスタンスを初期化します。 |
TaskFactory<TResult>(TaskCreationOptions, TaskContinuationOptions) |
指定された構成を使用して、TaskFactory<TResult> インスタンスを初期化します。 |
TaskFactory<TResult>(TaskScheduler) |
指定された構成を使用して、TaskFactory<TResult> インスタンスを初期化します。 |
プロパティ
CancellationToken |
このタスク ファクトリの既定のキャンセル トークンを取得します。 |
ContinuationOptions |
このタスク ファクトリの TaskContinuationOptions 列挙値を取得します。 |
CreationOptions |
このタスク ファクトリの TaskCreationOptions 列挙値を取得します。 |
Scheduler |
このタスク ファクトリのタスク スケジューラーを取得します。 |
メソッド
適用対象
スレッド セーフ
パブリックメンバーとプロテクトメンバーはすべてスレッドセーフであり、複数の TaskFactory<TResult> スレッドから同時に使用できます。