2010-06-15 72 views
3

我正在研究使用上述任何一種處理長時間運行操作的方式。使用TPL和異步模式之間的實際區別

我不會詳細介紹使用這些方法可以完成什麼,但我更願意解釋我想要做什麼。

我有一組HTTP相關的方法,每個方法都檢索幾條信息。這是長時間運行的服務中更大系統的一部分(所以它不是一次性的,可拋棄的代碼)。

一般情況下,哪種方法更好,封裝和可維護性明智的:處理返回的數據時,它使用了開始的準備/結束/ AsyncCallback的機制,或通過從觸發事件任務中,像OnXXXReceived,OnXXXError,使用派生的EventArgs類,每個事件?

我希望我已經清楚了..我決定不提供代碼示例,因爲我比意見,建議和可能的陷阱更感興趣,而不是具體實現的花絮。

謝謝!

回答

2

一般而言,TPL任務使用起來要容易得多。在你的情況下,使用Factory和LongRunning選項創建它們。

雖然我不太確定事件。爲什麼不在一個循環或類似的東西中處理Request/Rresponse?你已經在一個線程。

+0

主要是因爲從封裝的角度來看,這些操作不是那些知道應該如何處理數據的操作,一旦它們檢索到它們。這是外部範圍誰..但是,實際上,你可能是對的。我正在考慮將任務放入實現HTTP方法的類中,因此從外部代碼我將訂閱事件,然後調用內部啓動任務的方法,該任務將檢索信息並激發正確的事件。沒有想到將任務放入外部範圍,直接處理返回的數據。 – 2010-06-15 14:38:09

1

您還可以使用ContinuationTasks在抓取任務完成後處理數據。

Task<StockDataCollection> loadFedHistoricalData = 
     Task<StockDataCollection>.Factory.StartNew(
      () => LoadFedHistoricalData(), 
      TaskCreationOptions.LongRunning); 

    Task<StockDataCollection> normalizeHistoricalData = 
     loadFedHistoricalData.ContinueWith(
      (t) => NormalizeData(t.Result)); 

在此代碼loadFedHistoricalData任務運行LoadFedHistoricalData這是一個長期運行的I/O密集型任務。當它返回時,繼續執行另一個標準化數據的任務。

ContinueWith需要一個TaskContinuationOptions參數,該參數可用於指定延續任務是否總是運行,或者只是某些條件(如錯誤或取消)得到滿足。

第5章A-Dash示例顯示了這種用於事件的替代方法。您可以從http://parallelpatterns.codeplex.com/下載代碼。看看AnalysisEngine和MainWindowViewModel類。

+0

好主意,謝謝。 – 2010-08-16 12:00:00

1

當談到I/O性能時,您根本無法打敗異步編程模型(APM)。任何時候你都可以使用它,你應該是。幸運的是,任務並行庫(TPL)支持通過the FromAsync factory method支持將APM工作與「純粹」TPL任務相結合。

查看MSDN上.NET SDK的這一部分,標題爲TPL and Traditional .NET Asynchronous Programming,以獲取更多關於如何結合這兩種編程模型以實現異步涅。的信息。

相關問題