`RunWorkerCompleted` не всегда запускается - PullRequest
1 голос
/ 22 февраля 2012

Я использую несколько внешних сервисов, когда элементы в моем приложении завершены.Каждый сервис, с которым я должен связаться, получает свой BackgroundWorker для выполнения своей задачи.Я отслеживаю, сколько рабочих выполнили свою работу, чтобы определить, были ли какие-либо ошибки.Проблема, с которой я сталкиваюсь, заключается в том, что RunWorkerCompleted не всегда увольняют.

Вот что у меня есть:

var exceptionsCaught = new List<Exception>();
var completedCount = 0;

foreach(var notificationToSend in NotificationQueue)
{
    var backgroundWorker = new BackgroundWorker();
    backgroundWorker.DoWork += (sender, b) => notificationToSend();
    backgroundWorker.RunWorkerCompleted += (sender, args) =>
                                               {
                                                   Console.WriteLine("Done.");
                                                    if(args.Error != null)
                                                    {
                                                        exceptionsCaught.Add(args.Error);
                                                        Console.WriteLine("Error! {0}", args.Error.Message);
                                                    }
                                                   completedCount++;
                                               };
    backgroundWorker.RunWorkerAsync();
}

var exceptionCheckerWorker = new BackgroundWorker();
exceptionCheckerWorker.DoWork += (sender, b) =>
                 {
                     while (true)
                     {
                         if (completedCount != NotificationQueue.Count) continue;
                         if (exceptionsCaught.Any())
                         {
                             var notificationExceptionMessage =
                                 new NotificationExceptionsMessage(exceptionsCaught,
                                                                   _notificationGeneratedPath);
                             _eventAggregator.Publish(notificationExceptionMessage);

                             break;
                         }

                         break;
                     }
                 };
exceptionCheckerWorker.RunWorkerAsync();

Чего мне не хватает?

Когда ему не удается позвонить, я вижу The thread 0x2e0 has exited with code 0 (0x0). в своей консоли.

Я изменил способ увеличения моего счета с помощью Interlocked, но это ничего не изменило.Я знаю, что событие не вызывается, потому что у меня установлена ​​точка останова.

Есть идеи?

Ответы [ 3 ]

3 голосов
/ 22 февраля 2012

Вы уверены, что событие RunWorkerCompleted не вызвано? Наиболее вероятной причиной является неправильное увеличение поля completedCount. Попробуйте использовать Методы блокировки :

Interlocked.Increment(ref completedCount);
2 голосов
/ 22 февраля 2012

У вас есть условие гонки при увеличении completeCount.Вы должны использовать Interlocked.Increment

1 голос
/ 22 февраля 2012

Не знаю, но вы пишете многопоточную процедуру, которая обрабатывает глобальные данные без единой блокировки, что-то неприлично идет не так.

...