创建在C#在运行时事件处理
我创建共享一个事件处理这样的BackgroundWorker的数组:创建在C#在运行时事件处理
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;
}
很显然,在代码中,我试图让运行asyncronously BackgroundWorker的名单,但是,当我检查的结果,他们中的一些是不正确的。我猜测“e.result”的值被其他工作人员所取代,因为他们共享相同的事件处理程序,如果是这种情况,那么我想为每个BackgroundWorker创建个别事件处理程序,以便e.result的值将不会被取代。我将如何做到这一点?
尝试同步访问resultArray:
private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
lock(resultArray)
resultArray.Add(e.Result);
}
我加了锁,它现在正在工作。谢谢。 – murasaki5 2009-11-30 16:37:45
共享同一个事件处理方法不应该是一个问题 - 这是它提供了“E”,在其中您存储结果BackgroundWorker
。
另一方面,你是从多个线程访问resultArray
。这可能会导致问题。你在结果中看到什么样的错误?除了最后结合结果的方式之外,我希望它没问题。
我不明白e.Result如何被其他工人取代。 当你说某些结果不正确时,你的意思是这个值是错误的,没有任何价值,或者某些结果是重复的,而其他的结果是消失的? 在我看来,当添加到resultsArray以确保它是线程安全的时,您应该添加一个synclock。
如果所有后台工作人员都使用相同的EventArgs,则会出现问题。您的逻辑中可能存在问题,您在RunWorkerCompleted中收到的结果究竟有什么问题? – 2009-11-30 15:17:07
你如何“检查结果”?你是否依赖'resultArray'中的结果顺序? – 2009-11-30 15:19:00
你的代码在计算东西时也可能是一个问题,因为它可能需要同步。 – rerun 2009-11-30 15:19:53