2

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

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 中的新功能,或者可能使用 aMonitor而不是仅仅睡觉,但我希望在这里有一些更好的见解。

4

1 回答 1

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从其他地方得到的(即它被传入,或者你定义它并且其他人可以影响它的状态)。

于 2011-09-05T18:59:05.470 回答