在c#中在运行时创建eventhandler

时间:2009-11-30 15:08:18

标签: c# runtime event-handling

我正在创建一个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的值不会被取代。我该怎么做?

3 个答案:

答案 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,以确保它是线程安全的。