我正在使用一个可以在不同时间运行任务的计时器。任务和时间可能会更改,因此可能需要取消正在进行的等待以进行调整。而且整个计时器可能都停止了,这是另一个取消原因。
等待计时器是这样的:
await Task.Delay(timeToWait);
等待CancellationToken的过程如下:(可与计时器配合使用)
await Task.Delay(-1, cancellationToken);
或者这样:(无异常)
var tcs = new TaskCompletionSource<object>();
using (cancellationToken.Register(() => tcs.TrySetResult(null)))
{
await tcs.Task;
}
(那是正确的吗?)
我不知道如何使用await
等待AutoResetEvent。可能有大型图书馆填补了框架中的空白。
现在我需要将所有这三个结合起来。 AutoResetEvent的问题在于它来自旧的非异步世界。但这是我唯一可以重用的东西。因为CancellationTokens和TaskCompletionSources只能使用一次。使用它们之后,需要替换它们,并且需要使用新实例。而且还需要将其丢弃,此后不能再使用。这很难同步。总是有机会有人会等待旧实例。
是否有一种解决方案可以立即等待如此多种多样的同步事件,并在设置任何一个同步事件时返回,告诉我哪个同步事件? Task.WhenAll不支持AutoResetEvent。
我可以开始等待AutoResetEvent的新任务,然后设置一个新的CancellationToken。如果未设置此事件,则在整个等待之后,必须再次取消新任务。最终,这似乎变成了整个取消活动,OperationCanceledExceptions(可能还有其他)四处飞扬,IDisposables堆积在角落,但工作量不多。有没有更有效的解决方法?