非同期操作を開始するメソッドを公開するブラックボックス オブジェクトがあり、操作が完了するとイベントが発生します。私はそれTask<OpResult> BlackBoxOperationAysnc()
を TaskCompletionSource を使用してメソッドにラップしました - それはうまくいきます。
ただし、その非同期ラッパーでは、指定されたタイムアウト後にイベントが受信されない場合、タイムアウトエラーで非同期呼び出しを完了することを管理したいと考えています。現在、次のようにタイマーで管理しています。
public Task<OpResult> BlackBoxOperationAysnc() {
var tcs = new TaskCompletionSource<TestResult>();
const int timeoutMs = 20000;
Timer timer = new Timer(_ => tcs.TrySetResult(OpResult.Timeout),
null, timeoutMs, Timeout.Infinite);
EventHandler<EndOpEventArgs> eventHandler = (sender, args) => {
...
tcs.TrySetResult(OpResult.BlarBlar);
}
blackBox.EndAsyncOpEvent += eventHandler;
blackBox.StartAsyncOp();
return tcs.Task;
}
それがタイムアウトを管理する唯一の方法ですか? 自分のタイマーを設定せずに何らかの方法がありますか - TaskCompletionSource にタイムアウトが組み込まれているのが見えませんか?