У меня есть объект 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?