2014-03-26 35 views
0

我有以下場景:如何管理多線程c#應用程序

C#應用程序(.net 4.0/4.5),具有5-6個不同的線程。每個線程都有不同的任務,每隔x秒發起一次(範圍從5到300)。

每個任務有以下步驟:

  1. 從SQL Server獲取項目
  2. 轉換項目以JSON
  3. 將數據發送到web服務器
  4. 等待來自服務器的答覆。

由於此任務可能會在某些時候失敗(互聯網問題,超時等)什麼是.NET世界的最佳解決方案?

我想到了以下解決方案:

  • 產生新的線程每x秒(如果沒有這種類型的執行的另一個線程)
  • 產卵一個線程爲每種類型的任務和循環步驟每x秒(瞭解管理例外的方式)

哪個更安全可靠?應用程序將運行在無人值守的系統上,因此它應該能夠保持執行,而不管任何可能的例外。

+1

我的第一個問題是要真正確定多線程是否真的有必要,因爲它確實增加了進入的重大障礙和可維護性問題。 Percieved性能提升幾乎從來沒有。如果您使用多線程來提供響應式用戶界面,則應首先考慮異步/等待,這會降低複雜性。 –

+0

我認爲[TPL Dataflow](http://msdn.microsoft.com/en-us/library/hh228603(v = vs.110).aspx)是正確的工具。在這裏有一些很好的例子。 – Noseratio

回答

0

創建線程相當昂貴。第一種選擇不是很好的選擇。如果「do stuff」的週期非常短(在暫停之間),則可以考慮使用ThreadPool或TPL。如果線程大多忙碌,或者工作需要任何可觀的時間,那麼專門的工作人員就更合適。

至於例外:不要讓例外逃脫工人。你必須趕上他們。如果這意味着你放棄並在幾秒鐘內重試,那很可能是好的。

+0

您是否可以擴展對工作者沒有捕捉例外的影響? – Gusdor

+0

我不想告訴你,但「每隔幾秒鐘就有一個線程」 - 線程並不是那麼昂貴,它有所作爲。一點也不。 – TomTom

+0

@TomTom單獨的堆棧是一個MB; p但我的觀點是,通常有*更適當的*方式來處理工作,具體取決於涉及的工作概況 –

0

您可以使用生產者消費者模式方法來模擬整個事情。您有一位將新任務描述放入隊列的生產者,並且您可以擁有多個從隊列中處理的使用者(4或5個線程)。消費者或處理線程的數量可能因負載,隊列長度而異。

每個任務涉及從數據庫讀取,轉換格式,發送到Web服務器,然後處理來自Web服務器的響應。我假設每項任務都會完成所有這些步驟。

如果隊列中的項目發生異常,您可能會將隊列項目標記爲失敗,並計劃稍後重試。