У меня есть объект blackbox, который предоставляет метод для запуска операции async, и событие срабатывает, когда операция завершена. Я обернул это в метод 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?