2010-07-07 123 views
2

我正在运行需要很长时间才能运行的后台工作线程。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似乎很麻烦。如果这是一个糟糕的设计,我愿意接受建议!

回答

6

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

但是,这并不一定是最好的办法。一般来说,后台工作人员应该使用ReportProgress来表明其进展情况......在这种情况下,您是否有任何理由不想这样做?

+0

所以我需要的是“volatile int currentResult = 0;”? BackgroundWorker从自定义类('DirectoryStructure')中创建一些对象并在其中运行该方法。该方法是花费时间的。由于它是一个不同的类,我不能使用ReportProgress。一种选择似乎是将DirectoryStructure类的功能转移到包含BackgroundWorker的类中,但似乎很麻烦。我愿意提供建议...... – KalEl 2010-07-07 17:40:27

+0

@KalEl:仅仅因为你在不同的课程中并不意味着你不能使用ReportProgress。例如,您可以通过DirectoryStructure委托在每次进度有所调用时调用该代理,并从该委托中调用ReportProgress。我真的不认为共享访问变量是在这里沟通的好方法。 – 2010-07-07 17:48:47

+0

谢谢,有道理。 – KalEl 2010-07-07 17:59:12