倒计时通知的线程延迟的最佳实践

时间:2011-09-05 18:13:25

标签: c# .net multithreading countdownevent

我倾向于使用以下模式在很多不同的地方进行倒计时通知事件的定时延迟,以及取消的能力:

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));
}

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

1 个答案:

答案 0 :(得分:2)

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

您希望以某个间隔提供反馈,这意味着计时器。而不是轮询以查看是否请求取消,您可以等待等待句柄。

类似的东西:

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(即传入,或者您定义它,其他人可以影响其状态)。