2013-10-01 48 views
3

這裏是我一起工作的代碼:試圖通過BackgroundWorker的代碼調試,但程序步驟結束意外

try 
{ 
    mainWorker = new BackgroundWorker(); 
    mainWorker.DoWork += (sender, e) => 
    { 
     try 
     { 
      //stuff I want to have happen in the background 
      ... 
      //I want to step through the lines in this try block 
     } 
     catch 
     { 
      //exception not being caught 
     } 
    }; 
    mainWorker.RunWorkerCompleted += (sender, e) => 
    { 
     //code to let user know that the background work is done 
     ... 
    }; 
    mainWorker.RunWorkerAsync(); 
    mainWorker.Dispose(); 
} 
catch 
{ 
    //exception not being caught 
} 

我看不出有被拋出的異常。我在DoWork的try塊中設置了一個斷點。有時會碰到斷點,但是在經過一定數量的行後,程序結束。它並不總是以相同的代碼行結束。有時它根本沒有達到斷點。

如果我刪除了後臺工作程序,代碼將逐步通過。

我之前沒有實現過後臺工作人員,我試圖弄清楚我錯過了什麼,阻止了我逐步完成代碼。

編輯:忘了提及,如果我註釋掉Dispose()它仍然沒有通過。

+0

它是控制檯應用程序還是winforms? –

+0

這是一個控制檯應用程序 – Krondorian

回答

4

嘗試在mainWorker.Dispose();之前添加Console.Readline();。在BackgroundWorker完成其工作之前,您的應用程序可能會停止。

BackgroundWorker以background thread運行,因此如果主線程停止,它將被終止。

你可以用簡單的例子來測試它。此代碼將只顯示一個數字。

static void Main(string[] args) 
{ 
    BackgroundWorker mainWorker = new BackgroundWorker(); 
    mainWorker.DoWork += (sender, e) => 
     { 
      for (int i = 0; i < 5; i++) 
      { 
       Console.WriteLine(i); 
       Thread.Sleep(500); 
      } 
     }; 
    mainWorker.RunWorkerAsync(); 
} 

,但如果添加由Console.Readline();停止你的主線程,您將擁有所有的號碼,並通過DoWork代碼調試步驟。

+0

之後,你提到這一點,並在我的OP審查您的評論,我想確認我的項目的輸出類型,它並沒有設置爲控制檯畢竟。將輸出類型設置爲控制檯之後,現在可以正確執行! – Krondorian

+0

因此,如果我在ASP.NET MVC控制器中嘗試了背景工作,後臺線程將被終止不可預知,正確? –

0

還要檢查可能退出主線程的異常。

0

我發現爲了拋出異常以便我可以通過在後臺工作線程中運行的代碼進行調試,我需要在工具=>選項=>調試=>常規=>中打開「啓用我的代碼」啓用我的代碼。

然後確保在調試=>例外情況下,針對引發異常和用戶未處理異常檢查「公共語言運行時異常」複選框。