带有倒计时通知的线程延迟的最佳实践
-
26-10-2019 - |
题
我倾向于使用以下模式在许多不同的位置中用于定时延迟,并通过倒计时通知事件以及取消的能力:
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
从其他地方(即它通过了,或者您定义它,其他人可能会影响其状态)。
不隶属于 StackOverflow