Task①

Taskの基本①

Taskの作成/開始

以下コードでタスクを作成/開始できます。

var task = new Task(() => hoge());
task.Start();

以下のように①行で書くこともできます。

var task = Task.Run(() => hoge());

Taskの待機

Taskの終了を待機するには以下のようにします。

task.Wait();

以下のコードの場合、Wait()を実行することで"Sample Task"が"Method End"より先に出力されます。
Wait()しない場合、100ミリ秒待機している間に"Method End"が先に出力されます。

var task = Task.Run(
    () =>
    {
        Thread.Sleep(100);
        Console.WriteLine("Sample Task");
    });
task.Wait();
Console.WriteLine("Method End");

複数タスクの全終了を待機するには以下のようにします。

var tasks = new Task[] {...};
Task.WaitAll(tasks);

複数タスクのいずれかの終了を待機するには以下のようにします。

var tasks = new Task[] {...};
Task.WaitAny(tasks);

WaitAny()が処理を戻して以降も、未完了タスクは実行され続けます。

Taskの戻り値

Action/ラムダ式に戻り値が存在する場合、ResultプロパティからTaskの戻り値として取得できます。

var task = Task.Run(
    () =>
    {
        Thread.Sleep(1000);
        return 1;
    });
var result = task.Result;

Resultにアクセスするとタスクの完了を待機することになるので注意が必要です。
上記コードでは値を取得するために1000ミリ秒の待機が発生します。