我正在创建一个BackgroundWorker数组,该数组共享一个事件处理程序,如下所示:
BackgroundWorker[] workers = new BackgroundWorker[files.length];
for(int i = o; i<files.length; i++)
{
workers[i] = new BackgroundWorker();
workers[i].DoWork += new DoWorkEventHandler(worker_DoWork);
workers[i].RunWorkerCompleted += newRunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
workers[i].RunWorkerAsync(files[i]);
}
所有工作人员共享同一个事件处理程序,该事件处理程序仅使用不同的参数和结果来执行相同的操作,如下所示:
private void worker_DoWork(object sender, DoWorkEventArgs e)
{
e.Result = ComputeSomething(e.Argument.ToString());
}
private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
resultArray.Add(e.Result);
}
private int ComputeSomething(string file)
{
...
return number;
}
显然,在代码中,我试图列出异步运行的BackgroundWorker,但是当我检查结果时,其中一些是不正确的。我猜想“ e.result”的值已被其他工作程序代替,因为如果是这样,则它们共享同一个事件处理程序,那么我想为每个BackgroundWorker创建单独的事件处理程序,以便e.result的值不会被替换。我该怎么做?
最佳答案
尝试同步对resultArray的访问:
private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
lock(resultArray)
resultArray.Add(e.Result);
}
关于c# - 使用C#在运行时创建事件处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1820372/