在BackgroundWorker处理程序中使用参数

13

我使用一个单独的包装类实例将数据传递到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?
        }
        ));
    }
1个回答

19

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

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

    e.Result = new MyParams();
}

接着你可以在worker1_RunWorkerCompleted中通过e.Result获取它。

如果你需要传递附加的结果值而又不想把MyParams对象放在worker1_DoWork: e.Result中——那么你可以创建一个小的类ResultHolder,其中包含MyParamsMyResult属性,并使用该类在worker1_DoWork中传递结果。


谢谢!在worker1_DoWork中,我是否应该明确地将mpar写入e.Resulte.Result = mpar; - rem
@rem 是的,我认为这是一种推荐的方式。 - oleksii

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接