【问题标题】:Does BackgroundWorker's OnDoWork get called from the calling thread or the worker thread?BackgroundWorker 的 OnDoWork 是从调用线程还是工作线程调用的?
【发布时间】:2013-09-25 11:14:56
【问题描述】:

我继承了 BackgroundWorker 并覆盖了 OnDoWork:

protected override void OnDoWork(DoWorkEventArgs e)
{
    WorkerEndedEvent.Reset();
    base.OnDoWork(e);
}

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

【问题讨论】:

    标签: c# .net multithreading winforms backgroundworker


    【解决方案1】:

    它将由工作线程调用,并且不保证在调用 RunWorkerAsync 期间被调用。

    RunWorkerAsync 的文档指出:

    RunWorkerAsync 方法提交请求以启动操作 异步运行。当请求得到服务时,DoWork 事件 被提出,这反过来又开始执行你的背景 操作。

    所以RunWorkerAsync 只提交一个开始操作的请求——这将引发DoWork 事件。它不保证何时调用DoWork

    它也是documented,因为它使用单独的线程来工作:

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

    很明显,DoWork 是在与 RunWorkerAsync 不同的线程上调用的。

    【讨论】:

    • 太好了,谢谢。这只是来自经验,还是您知道有文档解释(MSDN 似乎对此只字未提!!)?
    • @noelicus 它必须从一个单独的线程中调用——否则它不会是异步的!
    • @noelicus: The documentation 包含一个间接提示:“您必须注意不要在 DoWork 事件处理程序中操作任何用户界面对象。相反,通过ProgressChanged 和 RunWorkerCompleted 事件”。这意味着 DoWork 在与调用 RunWorkerAsync 的线程不同的线程上执行,但 ProgressChangedRunWorkerCompleted 被编组回调用线程。
    • @MatthewWatson 这不取决于什么是异步吗?我一直认为这只是意味着 DoWork 即将“异步”运行。事实上,它必须同步调用一些东西来让它运行!
    • @DanielHilgarth 我知道!但OnDoWorkDoWork 不同,也不一定是DoWork 调用/线程的一部分。
    猜你喜欢
    • 1970-01-01
    • 2012-11-24
    • 2013-03-14
    • 2016-09-27
    • 1970-01-01
    • 1970-01-01
    • 2018-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多