带参数的基本BackgroundWorker用法

时间:2011-04-26 17:52:02

标签: c# parameters backgroundworker

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

object.Method(paramObj, paramObj2);

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

4 个答案:

答案 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