带参数的基本BackgroundWorker用法

Chr*_*ris 20 c# parameters backgroundworker

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

object.Method(paramObj, paramObj2);
Run Code Online (Sandbox Code Playgroud)

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

mse*_*dio 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.                        
    }
Run Code Online (Sandbox Code Playgroud)


Laz*_*OfT 10

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

public class MyWorkerContext
{
   public Object1 Worker;
   public Object2 Parameter1;
   public Object2 Parameter2;
}
Run Code Online (Sandbox Code Playgroud)

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

MyWorkerContext context = e.Argument as MyWorkerContext;

context.Worker.Method(context.Parameter1, context.Parameter2);
Run Code Online (Sandbox Code Playgroud)


Hen*_*man 6

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

bgw.DoWork += (sender, e) => object.Method(paramObj, paramObj2) ;
Run Code Online (Sandbox Code Playgroud)

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


小智 1

您可以将对象传递到BackgroundWorker.RunWorkerAsync() 方法中。您应该将两个 paramObjs 包装到一个对象中(您可以使用数组、元组或您编写的其他复合类)并将其作为参数传递到 RunWorkerAsync() 中。

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

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