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