我正在创建一个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的值不会被取代。我该怎么做?
答案 0 :(得分:7)
尝试同步对resultArray的访问:
private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
lock(resultArray)
resultArray.Add(e.Result);
}
答案 1 :(得分:1)
共享相同的事件处理程序方法应该不是问题 - 它是BackgroundWorker
,它提供了存储结果的“e”。
另一方面, 从多个线程访问resultArray
。这可能会导致问题。你在结果中看到了什么样的错误?除了你最后结合结果的方式之外,我希望它没问题。
答案 2 :(得分:1)
我不知道e.Result如何被其他工人取代。 当你说某些结果不正确时,你的意思是价值是错误的,根本没有价值,或者某些结果是否重复而其他结果消失了? 在我看来,你应该在添加到resultsArray时添加一个synclock,以确保它是线程安全的。