Создание обработчика событий во время выполнения в c # - PullRequest
1 голос
/ 30 ноября 2009

Я создаю массив 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 ]

7 голосов
/ 30 ноября 2009

Попробуйте синхронизировать доступ к resultArray:


private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    lock(resultArray)
        resultArray.Add(e.Result);
}
1 голос
/ 30 ноября 2009

Я не понимаю, как e.Result может быть заменен другими работниками. Когда вы говорите, что некоторые результаты неверны, вы имеете в виду, что значение неверно, что значения вообще нет, или, возможно, некоторые результаты дублируются, а другие исчезают? Мне кажется, вы должны установить синхронизацию при добавлении в resultsArray, чтобы убедиться, что он потокобезопасен.

1 голос
/ 30 ноября 2009

Совместное использование одного и того же метода обработчика событий не должно быть проблемой - это BackgroundWorker, который обеспечивает "e", в котором вы сохраняете результат.

С другой стороны, вы обращаетесь к resultArray из нескольких потоков. Это может быть причиной проблемы. Какие ошибки вы видите в результатах? Кроме того, как вы комбинируете результаты в конце, я ожидаю, что все будет хорошо.

...