c# - 使用C#在运行时创建事件处理程序

标签 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的值不会被替换。我该怎么做?

最佳答案

尝试同步对resultArray的访问:


private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    lock(resultArray)
        resultArray.Add(e.Result);
}

关于c# - 使用C#在运行时创建事件处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1820372/

相关文章:

swift - 对象/结构的自定义/动态属性

arrays - 如果 99% 的元素相同,是否可以在 O(n) 内对数组进行排序?

javascript - ng-mouseover 事件传递 'this'(自身)对 DOM 的引用不起作用。除了使用核心 javascript 事件之外,还有其他方法吗?

javascript - 如何在绑定(bind)到全部在 Javascript 中触发的多个事件时运行一次函数?

c#变量使用

c# - 使用 C# 创建 XML

c# - try catch 异常中的变量

c# - finally block 中的异常

algorithm - Log(n) 中的四联数

c# - 通过在父级上呈现新的 View Controller viewWillDisappear 被触发,我取消订阅事件