我正在运行需要很长时间才能运行的后台工作线程。C#:查询线程状态
实际功能存储位置的文件夹结构,但我们可以采取在不同的线程中运行下面的伪代码的一个例子 -
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
似乎是一个神奇的解决方案(感谢乔恩)!我打算通过一个string
以这种方式从工人类到UI的消息。
您可能想知道为什么我不使用ReportProgress
。原因是BackgroundWorker.DoWork
创建了一个不同类的对象,并调用了一个大量工作的方法。这种方法非常耗时。该类是获得目录结构的类,并且主要计算方法依赖于其中的许多相关方法。所以这个班级甚至不知道后台工作人员的存在,因此无法向其报告进度。将该类的功能移动到BackgroundWorker
似乎很麻烦。如果这是一个糟糕的设计,我愿意接受建议!
所以我需要的是“volatile int currentResult = 0;”? BackgroundWorker从自定义类('DirectoryStructure')中创建一些对象并在其中运行该方法。该方法是花费时间的。由于它是一个不同的类,我不能使用ReportProgress。一种选择似乎是将DirectoryStructure类的功能转移到包含BackgroundWorker的类中,但似乎很麻烦。我愿意提供建议...... – KalEl 2010-07-07 17:40:27
@KalEl:仅仅因为你在不同的课程中并不意味着你不能使用ReportProgress。例如,您可以通过DirectoryStructure委托在每次进度有所调用时调用该代理,并从该委托中调用ReportProgress。我真的不认为共享访问变量是在这里沟通的好方法。 – 2010-07-07 17:48:47
谢谢,有道理。 – KalEl 2010-07-07 17:59:12