當我的應用程序中的項目完成時,我正在使用幾個外部服務。我必須聯繫的每項服務都有自己的BackgroundWorker
來執行其任務。我跟蹤有多少工人完成了他們的工作,以確定是否有任何錯誤。我遇到的問題是RunWorkerCompleted
並不總是被解僱。`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
增加計數的方式,但這並沒有改變任何東西。我知道事件沒有被調用,因爲我有一個斷點。
任何想法?
我很確定,因爲我在那裏設置了一個斷點。另外,當它未能被調用時,我看到'線程0x2e0已經退出,並且在我的控制檯中有代碼0(0x0).'。 – Nosila 2012-02-22 16:44:25