我倾向于使用以下模式在许多不同的位置中用于定时延迟,并通过倒计时通知事件以及取消的能力:

CancellationToken ctoken = new CancellationToken();
for (int i = 0; i < 10; i++)
{
    if (ctoken.IsCancellationRequested) break;
    Thread.Sleep(1000);
    if (ctoken.IsCancellationRequested) break;
    if (Status != null) Status(this, new StatusEventArgs(i));
}

我想做的是将此模式抽象成自己的系统,可以用来阻止任何特定线程,直到达到倒计时为止。有什么最佳实践吗?它必须提供颗粒状状态的反馈(最好是我可以告诉它每秒钟通知我,十分之一等),并且必须支持取消(最好比每个秒更好的响应更好)。我觉得我应该使用新的 CountdownEvent .NET 4.0中的功能,或者可能使用 Monitor 不仅仅是睡觉,但我希望在这里有更好的见识。

有帮助吗?

解决方案

您应该做的第一件事是将反馈和取消的想法分开。也就是说,您有一种反馈机制和一种取消机制,但它们根本没有相关。如果您可以分开这两个概念,那么事情会变得更容易处理,并且会表现更好。

您想在某个间隔提供反馈,这意味着计时器。您可以在等待手柄上等待,而不是进行轮询以查看是否要求取消。

就像是:

int i = 0;
using (System.Threading.Timer tmr = new System.Threading.Timer((s) =>
    {
        if (Status != null) Status(this, new StatusEventArgs(i));
        ++i;
    }, null, 1000, 1000))
{
    token.WaitHandle.WaitOne(TimeSpan.FromSeconds(10)));
}

我认为你得到了 CancellationToken 从其他地方(即它通过了,或者您定义它,其他人可能会影响其状态)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top