Асинхронное ожидание времени, токена отмены и события - PullRequest
0 голосов
/ 25 октября 2018

Я работаю над таймером, который может запускать задачи в разное время.Задачи и время могут меняться, поэтому может потребоваться отменить текущее ожидание для его корректировки.И весь таймер может быть остановлен, так что это еще одна причина отмены.

Ожидание таймера происходит следующим образом:

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 накапливаются в углу, но не так много работы.Есть ли более эффективный способ ее решения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...