Я работаю над таймером, который может запускать задачи в разное время.Задачи и время могут меняться, поэтому может потребоваться отменить текущее ожидание для его корректировки.И весь таймер может быть остановлен, так что это еще одна причина отмены.
Ожидание таймера происходит следующим образом:
await Task.Delay(timeToWait);
Ожидание CancellationToken идет так: (комбинируется с таймером)
await Task.Delay(-1, cancellationToken);
Или вот так: (без исключений)
var tcs = new TaskCompletionSource<object>();
using (cancellationToken.Register(() => tcs.TrySetResult(null)))
{
await tcs.Task;
}
(Это даже правильно?)
Я не знаю, как ждать AutoResetEventс await
.Вероятно, есть большие библиотеки, которые заполняют пробел в структуре.
Теперь мне нужно объединить все эти три.Проблема с AutoResetEvent в том, что он из старого не асинхронного мира.Но это единственное, что я знаю, что можно использовать повторно.Потому что CancellationTokens и TaskCompletionSources можно использовать только один раз.После их использования их необходимо заменить и использовать новый экземпляр.И они также должны быть утилизированы и не могут быть использованы после этого.Это очень сложно синхронизировать.Всегда есть вероятность, что кто-то будет ждать старого экземпляра.
Есть ли решение, чтобы сразу ожидать такого разнообразия событий синхронизации, возвращая, когда какое-либо из них установлено, сообщая мне, какое из них?Task.WhenAll не поддерживает AutoResetEvent.
Я мог бы запустить новые задачи, которые ждут AutoResetEvent, а затем установить новый CancellationToken.Если это событие не было установлено, то после всего ожидания новая задача должна быть отменена снова.Похоже, это в конечном итоге превращается в целый фестиваль отмены, где OperationCanceledExceptions (и, возможно, другие) летают вокруг, а IDisposables накапливаются в углу, но не так много работы.Есть ли более эффективный способ ее решения?