2012-02-22 123 views
1

當我的應用程序中的項目完成時,我正在使用幾個外部服務。我必須聯繫的每項服務都有自己的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增加計數的方式,但這並沒有改變任何東西。我知道事件沒有被調用,因爲我有一個斷點。

任何想法?

回答

3

是否確定RunWorkerCompleted事件沒有引發?最可能的原因是您沒有正確增加completedCount字段。嘗試使用Interlocked methods

Interlocked.Increment(ref completedCount); 
+0

我很確定,因爲我在那裏設置了一個斷點。另外,當它未能被調用時,我看到'線程0x2e0已經退出,並且在我的控制檯中有代碼0(0x0).'。 – Nosila 2012-02-22 16:44:25

2

您遞增completedCount當有競爭狀態。你應該使用Interlocked.Increment

1

我不知道,但你正在編寫一個多線程的程序,剪切全局數據沒有一個鎖,有些東西出錯了。