c# - 倒计时通知线程延迟的最佳实践

标签 c# .net multithreading countdownevent

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

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/

相关文章:

c# - 寻找一个好的练习来帮助我在多线程方面做得更好

c# - 正则表达式,MVS 不喜欢我的正则表达式字符串,我该如何让它符合要求

c# - !(x is null) 和 x is object 之间有区别吗

c# - 读取 CSV 文件并转换为转置表

java - 新实例不终止线程

具有节流/吞吐量控制的 Java Executor

c# - 将图像转换为要绘制的线条数组

c# - 填充矩形的外部

c# - 如何在自定义目标之后运行构建后事件?

java - 从与创建 ExecutorService 不同的线程调用 ExecutorService.shutdown() 和 waitTermination() 是否安全?