C#:查询线程的状态

时间:2010-07-07 17:29:54

标签: c# multithreading

我正在运行一个需要很长时间才能运行的后台工作线程。

实际函数存储位置的文件夹结构,但我们可以举例说明在不同线程中运行的以下伪代码 -

private int currentResult=0;
private void worker() {
    for(int n = 0; n<1000; ++n)
    {
        int result;
        // Do some time consuming computation and update the result
        currentResult = result;
    }
}

这是在BackgroundWorker主题中运行的。我可以安全地从另一个帖子中读取currentResult吗?

编辑:

关键字volatile似乎是一个神奇的解决方案(感谢Jon)!我计划以这种方式将string从工人类传递给用户界面。

您可能想知道为什么我不使用ReportProgress。原因是BackgroundWorker.DoWork创建了一个不同类的对象,并调用那里执行大量工作的方法。这种方法很耗时。该类是一个获取目录结构的类,以及主计算方法所依赖的许多相关方法。因此,这个班级甚至不知道后台工作人员的存在,因此无法向其报告进度。将类的移动功能转移到BackgroundWorker似乎很混乱。如果这是一个糟糕的设计,我愿意接受建议!

1 个答案:

答案 0 :(得分:6)

如果你使它成为volatile,你可以......或者如果你总是使用Interlocked类来读写它。 (或者总是在同一台显示器上的锁中读/写它。)如果没有这些预防措施,你最终可能会读到陈旧的值。

但是,这不一定是做事的最佳方式。通常,后台工作人员应使用ReportProgress来表明其进度...在这种情况下,您是否有任何理由不想这样做?