带参数的基本BackgroundWorker用法

我想要在后台线程中执行的进程密集型方法调用如下所示:

object.Method(paramObj, paramObj2); 

所有这三个对象都是我创建的对象。 现在,从我看到的最初示例中,您可以将对象传递给后台工作者的DoWork方法。 但是,如果我需要将额外的参数传递给该对象,我应该怎么做呢,就像我在这里做的那样? 我可以将它包装在一个对象中并完成它,但我认为在其他人的输入上是明智的。

您可以将任何对象传递给RunWorkerAsync调用的object参数,然后从DoWork事件中检索参数。 您还可以使用DoWorkEventArgs中的Result变量将参数从DoWork事件传递到RunWorkerCompleted事件。

  public Form1() { InitializeComponent(); BackgroundWorker worker = new BackgroundWorker(); worker.DoWork += new DoWorkEventHandler(worker_DoWork); worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted); object paramObj = 1; object paramObj2 = 2; // The parameters you want to pass to the do work event of the background worker. object[] parameters = new object [] { paramObj, paramObj2 }; // This runs the event on new background worker thread. worker.RunWorkerAsync(parameters); } private void worker_DoWork(object sender, DoWorkEventArgs e) { object[] parameters = e.Argument as object[]; // do something. e.Result = true; } private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { object result = e.Result; // Handle what to do when complete. } 

我想到的最简单的方法是创建一个具有每个对象属性的类,并传递它。

 public class MyWorkerContext { public Object1 Worker; public Object2 Parameter1; public Object2 Parameter2; } 

然后在DoWork中你只需做一些事情:

 MyWorkerContext context = e.Argument as MyWorkerContext; context.Worker.Method(context.Parameter1, context.Parameter2); 

您可以在lambda中捕获它们以用于DoWork:

 bgw.DoWork += (sender, e) => object.Method(paramObj, paramObj2) ; 

e.Argument (即传递给BackgroundWorker.RunWorkerAsync()的状态值或对象)可以是3中的1,但它是System.Object类型,需要装箱。 直接在lambda中传递所有参数可以为所有参数提供完全的类型安全性,而无需任何装箱或铸造。

您可以将Object传递给BackgroundWorker.RunWorkerAsync()方法。 您应该将两个paramObjs包装成一个Object(您可以使用数组,元组或其他一些您要编写的复合类),并将其作为参数传递给RunWorkerAsync()。

然后,当您的DoWork事件被引发时,您可以通过查看事件处理程序的DoWorkEventArgs参数的Argument属性来检索此值。

有关完整示例,请访问MSDN: http : //msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker%28v=VS.90%29.aspx