如何使BackgroundWorker返回一个对象
我需要使RunWorkerAsync()
返回一个List<FileInfo>
。 我怎样才能从一个后台工作人员返回一个对象?
在BackgroundWorker
的DoWork
事件处理程序(后台工作发生的地方)中,有一个参数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()的函数,它有一个可以返回值的重载。
检查了解更多信息