BackgroundWorker的OnDoWork方法是由哪个线程调用的,是调用线程还是工作线程?

3
我继承了一个 BackgroundWorker 并覆盖了 OnDoWork 方法:
protected override void OnDoWork(DoWorkEventArgs e)
{
    WorkerEndedEvent.Reset();
    base.OnDoWork(e);
}

我的问题是,这将从哪个线程调用?是否保证在我的调用RunWorkerAsync()期间调用它,或者它可能在此后调用(即从工作线程调用)?

1个回答

4

它将被工作线程调用,不能保证在调用RunWorkerAsync时调用。

RunWorkerAsync的文档说明:

RunWorkerAsync方法提交请求以异步开始操作。当请求得到处理时,将引发DoWork事件,进而开始执行后台操作。

因此,RunWorkerAsync仅提交请求以启动操作 - 这将引发DoWork事件。 它不能保证何时调用DoWork

其文档还指出它使用单独的线程进行工作:

在单独的线程上执行操作。

因此,显然DoWork是在调用RunWorkerAsync的不同线程上调用的。


太好了,谢谢。这是你的经验吗?还是你知道有文档解释(MSDN似乎没有提到任何相关内容!!)? - noelicus
@noelicus 必须从单独的线程调用 - 否则它就不是异步的了! - Matthew Watson
@noelicus:文档中含有一个间接提示:“您必须小心,不要在DoWork事件处理程序中操作任何用户界面对象。相反,通过ProgressChanged和RunWorkerCompleted事件与用户界面通信。”这意味着DoWork在调用RunWorkerAsync的线程上执行,但是ProgressChangedRunWorkerCompleted会被编组回调用线程。 - Daniel Hilgarth
@MatthewWatson 这不取决于什么是异步吗?我一直认为它只是意味着DoWork即将被“异步”运行。实际上,它将必须调用一些同步的东西来让它开始运行!! - noelicus
@DanielHilgarth 我知道!但是 OnDoWork 不同于 DoWork,并且不一定是 DoWork 调用/线程的一部分。 - noelicus
@noelicus:确实,你是正确的。base.OnDoWork 可能 实际上是启动后台线程的地方。然而,使用ILSpy来窥视源代码显示这并不是事实。RunWorkerAsync 是启动后台线程的方法。该线程随后调用 OnDoWork - Daniel Hilgarth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接