35

非同期操作を開始するメソッドを公開するブラックボックス オブジェクトがあり、操作が完了するとイベントが発生します。私はそれ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 にタイムアウトが組み込まれているのが見えませんか?

4

2 に答える 2