带有倒计时通知的线程延迟的最佳实践
本文关键字:最佳 延迟 线程 倒计时 通知 | 更新日期: 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
(即它被传递进来,或者你定义它,其他人可以影响它的状态)。