我想在后台线程中执行的进程密集型方法调用如下所示:
object.Method(paramObj, paramObj2);
这三个对象都是我创建的对象。现在,从我看到的最初示例中,您可以将对象传递给后台工作者的DoWork方法。但是,如果我需要将额外的参数传递给该对象,我应该怎么做呢,就像我在这里做的那样?我可以将它包装在一个对象中并完成它,但我认为在其他人的输入上是明智的。
答案 0 :(得分:54)
您可以将任何对象传递给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.
}
答案 1 :(得分:10)
我想到的最简单的方法是创建一个具有每个对象属性的类,并传递它。
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);
答案 2 :(得分:6)
您可以在Lambda for DoWork中捕获它们:
bgw.DoWork += (sender, e) => object.Method(paramObj, paramObj2) ;
e.Argument
(即传递给BackgroundWorker.RunWorkerAsync()
的状态值或对象)可能是3中的1,但它是System.Object
类型,需要装箱。直接在lambda中传递所有参数可以为所有参数提供完全的类型安全性,而无需装箱或铸造。
答案 3 :(得分:1)
您可以将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