使用BackgroundWorker处理程序中的参数

rem*_*rem 13 c# parameters multithreading backgroundworker

为了将数据传递到BackgroundWorkerDoWork我使用一个单独的包装类"实例:

MyParams mpar = new MyParams();
...
mpar.Par1 = par1val;
mpar.Par2 = par2val;
mpar.Par3 = par3val;
...
var worker1 = new System.ComponentModel.BackgroundWorker();
worker1.DoWork += new DoWorkEventHandler(worker1_DoWork);
worker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker1_RunWorkerCompleted);
worker1.RunWorkerAsync(mpar);
Run Code Online (Sandbox Code Playgroud)

然后我可以使用mpar实例的参数worker1_DoWork,在另一个线程中操作.

void worker1_DoWork(object sender, DoWorkEventArgs e)
 {
      //here we use mpar.Par1, mpar.Par2 and so on
 }
Run Code Online (Sandbox Code Playgroud)

RunWorkerCompletedEventHandler我们做的UI线程一些postactions.

我的问题是:我们可以在RunWorkerCompleted处理程序中使用它在处理程序mpar之前工作的实例,DoWork我们可以确定它的值与它的相同DoWork吗?如果不是,那么为各个BackgroundWorker操作阶段共享参数的正确方法是什么?

void worker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        Dispatcher.BeginInvoke((Action)(() =>
        {
            //Can we use the mpar instance here?
        }
        ));
    }
Run Code Online (Sandbox Code Playgroud)

ole*_*sii 19

您可以指定e.Resultin 的值worker1_DoWork

static void worker1_DoWork(object sender, DoWorkEventArgs e)
{
    //Do the work
    //...

    e.Result = new MyParams();
}
Run Code Online (Sandbox Code Playgroud)

然后你就可以在得到它worker1_RunWorkerCompletede.Result.

如果你需要传递额外的结果值并且你不想把MyParams对象放在worker1_DoWork: e.Result- 那么你可以创建一个ResultHolder带有MyParamsMyResult作为属性的小类,并使用该类传递结果worker1_DoWork