如何使BackgroundWorker返回一个对象

54 c# concurrency asynchronous worker-process backgroundworker

我需要RunWorkerAsync()回报一个List<FileInfo>.如何从后台工作者返回一个对象?

Dav*_*vid 92

在你的DoWork事件处理程序BackgroundWorker(后台工作发生的地方)中有一个参数DoWorkEventArgs.该对象具有公共属性对象Result.当您的工作人员生成其结果(在您的情况下,a List<FileInfo>)时,设置e.Result为该结果并返回.

现在您的BackgroundWorker已完成其任务,它会触发RunWorkerCompleted事件,该事件将RunWorkerCompletedEventArgs对象作为参数.RunWorkerCompletedEventArgs.Result将包含您的结果BackgroundWorker.

例:

private void bgw_DoWork(object sender, DoWorkEventArgs e)
{
    int result = 2+2;
    e.Result = result;
}

private void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    int result = (int)e.Result;
    MessageBox.Show("Result received: " + result.ToString());
}
Run Code Online (Sandbox Code Playgroud)


JMa*_*sch 20

我假设您不想阻止并等待RunWorkerAsync()获取结果(如果您这样做,则没有理由运行异步!

如果要在后台进程完成时收到通知,请挂钩RunWorkerCompleted事件.如果要返回某个状态,请将其返回到DoWork事件参数的Result成员中.

编辑:我过早发布 - 完成了我的代码示例

例:



    private void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
    {
      // do your thing
      ....
      // return results
      e.Result = theResultObject;
    }

    // now get your results
    private void BackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
      MyResultObject result = (MyResultObject)e.Result;
      // process your result...
    }



Wel*_*bog 0

根据您的模型,您要么希望工作线程在完成工作时回调到其创建者(或其他进程),要么必须经常轮询工作线程以查看它是否已完成,如果所以,得到结果。

等待工作线程返回其结果的想法破坏了多线程的好处。