我正在运行一个需要很长时间才能运行的后台工作线程。
实际函数存储位置的文件夹结构,但我们可以举例说明在不同线程中运行的以下伪代码 -
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
似乎很混乱。如果这是一个糟糕的设计,我愿意接受建议!
答案 0 :(得分:6)
如果你使它成为volatile
,你可以......或者如果你总是使用Interlocked
类来读写它。 (或者总是在同一台显示器上的锁中读/写它。)如果没有这些预防措施,你最终可能会读到陈旧的值。
但是,这不一定是做事的最佳方式。通常,后台工作人员应使用ReportProgress
来表明其进度...在这种情况下,您是否有任何理由不想这样做?