rem*_*rem 13 c# parameters multithreading backgroundworker
为了将数据传递到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);
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_RunWorkerCompleted的e.Result.
如果你需要传递额外的结果值并且你不想把MyParams对象放在worker1_DoWork: e.Result- 那么你可以创建一个ResultHolder带有MyParams和MyResult作为属性的小类,并使用该类传递结果worker1_DoWork
| 归档时间: |
|
| 查看次数: |
10878 次 |
| 最近记录: |