Я использую несколько внешних сервисов, когда элементы в моем приложении завершены.Каждый сервис, с которым я должен связаться, получает свой 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
, но это ничего не изменило.Я знаю, что событие не вызывается, потому что у меня установлена точка останова.
Есть идеи?