2012-04-16 48 views
1

我有一個應用程序正在並行執行4個不同的作業。我使用並行任務庫。任務並行庫和異常

的代碼看起來是這樣的:

while (true) 
     { 
      var fetch = new FetcherHandler(); 

      var tasks = new Task[4]; 

      tasks[0] = Task.Factory.StartNew(fetch.GetJobs); 

      tasks[1] = Task.Factory.StartNew(fetch.GetStatusNew); 

      tasks[2] = Task.Factory.StartNew(fetch.GetJobsForStatus); 

      tasks[3] = Task.Factory.StartNew(fetch.GetStatusOld); 
      Task.WaitAll(tasks); 

      Thread.Sleep(10000); 
     } 

上述絕不會因爲所有這些4個任務達成Thread.sleep代碼是永無止境的循環。代碼示例的第一個任務:

public void GetJobs() 
     { 
    while (true) 
      { 
       try 
        { 
         handler.GetNewJob(); 
         } 
        catch (Exception exception) 
        { 
          var mail = new MailService(); 
          mail.SendExeption("Error has accured in GetJobs", exception); 
          throw; 
         } 
        } 
       } 
       Thread.Sleep(15000); }} 

上面的代碼的偉大工程,它做了一些工作,然後睡15秒,然後再次做它。出現異常時會出現此問題。

異常被捕獲並且給我發送了一封郵件,但是在異常之後,thred不會在循環中繼續,所以GetNewJob()方法將永遠不會再被執行。

任何想法異常命中時線程會發生什麼,以及如何「保存」線程以使其可以繼續?

+0

與您的問題無關,但等待無休止的任務有什麼意義? – hvd 2012-04-16 08:39:24

回答

2

Becasue你throw異常,所以異常的傳播堆棧頂部並中斷源線程的執行。

catch (Exception exception) 
{ 
    var mail = new MailService(); 
    mail.SendExeption("Error has accured in GetJobs", exception); 
    throw; //THIS LINE ! 
} 

您可以使用一個事件來提高,比方說,ExceptionCaught(..),聽你的程序內部的事件。

+0

謝謝!你知道這個拋出是否會殺死整個應用程序或者只有線程? – Fore 2012-04-16 08:57:11

+0

尋找所提供的代碼,它會殺死應用程序 – Tigran 2012-04-16 09:02:07