2013-11-22 30 views
0

我有一個在C#.Net 4.5中創建的應用程序。我正在通過任務類使用多線程。我想添加一些錯誤處理。具體而言,我希望有任何例外可以鼓舞到我的應用程序的頂部。帶任務和異常處理的多線程

我被卡住的地方是在使用任務時如何處理未處理的異常或任何事情。

我一直在看這頁http://msdn.microsoft.com/en-us/library/dd997415(v=vs.110).aspx。我的理解是,如果我有多個任務正在運行,並且發生錯誤,我必須等到Task.WaitAll(someTask)被調用並且可以在那裏處理 - 是否正確?在等待Task.WaitAll(someTask)之前,在一個任務中發生錯誤以取消所有其他任務時可能嗎?

下面是我的代碼片段。我猜嵌套任務的原理同樣適用,我必須等到兩個Task.WAitAll()都被調用後才能處理我的錯誤?我對這個應用程序的方法相當簡單,我想要記錄任何被拋出的執行,然後關閉應用程序。只是不確定這是如何處理任務。

也正確的方式,我創建兩個TaskFactory的?兩種方法都在不同的類別中。

public void RunTimePeriods() 
     { 
      _taskFactory = new TaskFactory(); 

      Task[] taskTimePeriod = new Task[_timePeriods.Length]; 

      for (int i = 0; i < taskTimePeriod.Length; i++) 
       taskTimePeriod[i] = _taskFactory.StartNew(_timePeriods[i].RunIndicators); 

      Task.WaitAll(taskTimePeriod); 
     } 


public void RunIndicators() 
     { 
      _taskFactory = new TaskFactory(); 

      Task[] taskIndicator = new Task[_indicator.Length]; 

      for (int i = 0; i < taskIndicator.Length; i++) 
       taskIndicator[i] = _taskFactory.StartNew(_indicator[i].Run); 
     } 
+0

你爲什麼要創建兩個工廠?你能否提供更多關於使用的兩種「運行」方法的細節。什麼是'_indicator' – faizanjehangir

+0

不確定。只是認爲這可能是一個錯誤,因爲我發佈這個問題,因此最後一行。如果你只使用一個然後不管? – mHelpMe

+1

查看此鏈接:http://msdn.microsoft.com/en-us/library/dd537607.aspx;您可以在子線程中拋出ThrowIfCancellationRequested,並在主線程上等待(Wait),然後取消主任務和所有子任務。 –

回答

2

是否有可能當一個任務發生錯誤不必等待Task.WaitAll(someTask)之前取消所有其他任務?

您可以做到這一點的唯一方法是通知其他任務,以阻止他們正在做的事情。此類通信的一般解決方案是使用task cancellation

這是一個很好的walkthrough

+0

你的權利,這是一個很好的演練。它也回答了我對如何使用TaskFactory的懷疑。我是否正確地說我不需要創建一個新的TaskFactory類,而是使用Task.Factory?如果TaskFactory需要一些自定義設置,您是否只創建一個新的TaskFactory? – mHelpMe

+0

@mHelpMe如果你想生成一個自定義的'任務'衍生物,你需要一個自定義工廠來產生它。如果你想使用不同的調度器,你也可以創建一個新的工廠實例。 – Gusdor

+0

@mHelpMe是的,如果你需要一些自定義配置,你只需要創建你自己的'TaskFactory'。如果不是,則應使用默認實例,即「Task.Factory.StartNew(...)'。 – James