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

本文关键字:最佳 延迟 线程 倒计时 通知 | 更新日期: 2023-09-27 18:07:45

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

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而不是只是睡觉,但我希望这里有一些更好的见解。

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

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

您希望在一定间隔内提供反馈,这意味着要使用计时器。您可以等待等待句柄,而不是轮询是否请求取消。

类似:

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(即它被传递进来,或者你定义它,其他人可以影响它的状态)。