在BackgroundWorker处理程序中使用参数

本文关键字:参数 程序 BackgroundWorker 处理 | 更新日期: 2023-09-27 17:59:12

为了将数据传递到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);

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

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

RunWorkerCompletedEventHandler中,我们在UI线程中做了一些后置操作

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

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

在BackgroundWorker处理程序中使用参数

您可以在worker1_DoWork 中分配e.Result的值

static void worker1_DoWork(object sender, DoWorkEventArgs e)
{
    //Do the work
    //...
    e.Result = new MyParams();
}

然后您可以在e.Result中的worker1_RunWorkerCompleted中获得它。

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