在BackgroundWorker处理程序中使用参数
本文关键字:参数 程序 BackgroundWorker 处理 | 更新日期: 2023-09-27 17:59:12
为了将数据传递到BackgroundWorker
的DoWork
,我使用了一个单独的包装类实例:
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?
}
));
}
您可以在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
中,那么您可以创建一个以MyParams
和MyResult
为属性的小类ResultHolder
,并使用该类在worker1_DoWork
中传递结果