我倾向于在很多不同的地方使用以下模式来实现倒计时通知事件的定时延迟,以及取消的能力:
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
(即它是传入的,或者您定义它并且其他人可以影响它的状态)。
关于c# - 倒计时通知线程延迟的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7311468/