如何使BackgroundWorker返回一个对象

我需要使RunWorkerAsync()返回一个List<FileInfo> 。 我怎样才能从一个后台工作人员返回一个对象?

BackgroundWorkerDoWork事件处理程序(后台工作发生的地方)中,有一个参数DoWorkEventArgs 。 这个对象有一个公共属性对象Result。 当你的工作者已经产生了它的结果(在你的情况下, 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()); } 

我假设你不想阻塞和等待RunWorkerAsync()的结果(如果你这样做,将没有理由运行asynchronous!

如果要在后台进程完成时收到通知,请挂接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... }
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... } 

RunWorkerAsync()以asynchronous方式启动进程,并在进程实际完成之前返回并继续执行代码。 如果您想获取BackgroundWorker的结果,您需要创build一个实例variables来保存该值,并在BackgroundWorker完成后检查它。

如果您想等到工作完成,那么您不需要BackgroundWorker

你可以让你的线程以该对象作为参数来引发一个事件:

 ThreadFinishedEvent(this, new ThreadEventArgs(object)); 

哪里:

 public class ThreadEventArgs : EventArgs { public ThreadEventArgs(object object) { Object = object } public object Object { get; private set; } } 

根据您的模型,您可能希望在完成工作时将工作线程callback给其创build者(或其他进程),或者必须每隔一段时间轮询一次工作线程以查看是否完成工作,如果所以,得到结果。

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

一般来说,当运行一个进程asynchronous时,工作线程应该调用一个委托或触发一个事件(如ChrisF)。

您可以检查出具有一些可以返回值的并发function的新PFX。

例如有一个名为Parallel.ForEach()的函数,它有一个可以返回值的重载。

检查了解更多信息

http://msdn.microsoft.com/en-us/magazine/cc817396.aspx

Interesting Posts