タスク ファクトリ

タスク ファクトリは、Task オブジェクトを作成する System.Threading.Tasks.TaskFactory クラス、または Task<TResult> オブジェクトを作成する System.Threading.Tasks.TaskFactory<TResult> クラスによって表されます。 どちらのクラスにも、以下を実行するために使用できるメソッドがあります。

  • タスクを作成し、それらのタスクをすぐに開始する。 詳細については、「タスクの並列化 (タスク並列ライブラリ)」を参照してください。

  • 一連のタスクのいずれかまたはすべてが完了したときに開始される、タスクの継続を作成する。 詳細については、「継続タスク」を参照してください。

  • 非同期プログラミング モデルに準拠した開始メソッドと終了メソッドの組み合わせを表すタスクを作成する。 詳細については、「TPL と従来の .NET 非同期プログラミング」を参照してください。

Task クラスには、既定の TaskFactory を表す静的プロパティがあります。 通常、TaskFactory メソッドは、次の例に示すように、Factory プロパティを使用して呼び出します。

[Visual Basic]

Dim taskA as Task = Task.Factory.StartNew(Sub( ...))

[C#]

Task taskA = Task.Factory.StartNew( () => ...);

ほとんどの場合、TaskFactory から新しいクラスを派生させる必要はありません。 ただし、新しい TaskFactory を構成し、それを使用して特定のオプションを指定したり、タスクにカスタム スケジューラを関連付けたりすると便利な場合があります。 指定した TaskScheduler をすべて使用し、指定した TaskCreationOptions オプションがあるタスクを作成する、新しい TaskFactory を構成する方法を次の例に示します。

Class Program
    Shared Sub Main()
        Dim cts As CancellationTokenSource = New CancellationTokenSource()
        Dim _factory As TaskFactory = New TaskFactory(
                                        cts.Token,
                                        TaskCreationOptions.PreferFairness,
                                        TaskContinuationOptions.ExecuteSynchronously,
                                        New MyScheduler())

        Dim t2 = _factory.StartNew(Sub() DoWork())
    End Sub
    Shared Sub DoWork()
        ' ...
    End Sub
class Program
{
    static CancellationTokenSource cts = new CancellationTokenSource();
    private static TaskFactory _factory = new TaskFactory(
                                        cts.Token,
                                        TaskCreationOptions.PreferFairness,
                                        TaskContinuationOptions.ExecuteSynchronously,
                                        new MyScheduler());

    static void Main(string[] args)
    {
        var t2 = _factory.StartNew(() => DoWork());            
    }

    static void DoWork() {/*...*/ }
}

参照

概念

.NET Framework の並列プログラミング