TCSについて調べてみました。
TCSとはTaskCompletionSourceの略で、インスタンスを作成しそのインスタンスを渡すことで
非同期に結果を受け取ることができるオブジェクトのことです。
外部のイベントやコールバックでTaskを完了させたいときにとても便利なクラスです。
| 役割 | 説明 |
Task |
非同期処理の結果を表す |
TaskCompletionSource |
Taskを完了させるためのスイッチを持つ |
◆基本サンプル
■ TaskCompletionSource を使って Task を返すメソッド
public Task<string> WaitEventAsync()
{
var tcs = new TaskCompletionSource<string>(
TaskCreationOptions.RunContinuationsAsynchronously
);
// 3秒後に完了させる非同期処理の例
Task.Run(async () =>
{
await Task.Delay(3000);
tcs.SetResult(“完了しました!”);
});
return tcs.Task;
}
呼び出し側
var result = await WaitEventAsync();
Console.WriteLine(result); // → 3秒後 “完了しました!”
◆TaskCreationOptions.RunContinuationsAsynchronouslyの意味
SetResultのあとの処理(continuation)がSetResultを呼び出したスレッドでそのまま実行される恐れがある。
そのため、continuationをスレッドプールに予約して後で実行させる必要がある。
これで、便利にスレッド間で同期処理ができる!