2011-11-17 78 views
10

我開始閱讀關於.NET 4.5異步的內容,但坦白地說,無法獲取它的大部分內容,但是何時使用模式。所以我會試着去直接提問:.NET 4.5異步與TPL

我通常使用.NET 4 TPL從ASP.NET應用程序中調用昂貴的Web服務和數據庫調用。似乎我可以用Async實現同樣的功能。這是真的?何時使用哪個?

在此先感謝。

回答

15

TPL是一個用於並行計算的庫。 .NET 4.5異步是一種構建在TPL基礎之上的語言功能,它使流程更加簡單。當您擁有多個步驟的工作流程時尤其如此。

簡而言之,async可讓您編寫代碼,就好像它是同步的,因此邏輯流程保持不變。等待任務完成的過程可以通過async以非常自然的方式完成。 C#5.0和VB 11.0編譯器使用TPL和一些新的相關類型將代碼轉換爲等效的C#4.0和VB 10.0代碼。

對於async的一個很好的內部解釋,請參閱Jon Skeet的Eduasync博客系列。

那麼,你如何決定使用哪個?那麼,async基本上將創建一系列代碼片斷的複雜性抽象出來,這些代碼片斷通過異步調用鏈接在一起。推測當你調用一個Web服務或訪問一個數據庫時,你想對返回的內容做些什麼。 async允許您將調用和處理代碼放在一起,這會使您的代碼更容易編寫,並且以後也更容易閱讀。

+0

謝謝jeffrey的回覆,但還是不知道何時使用哪個..例如在Web服務調用示例中說。 –

+1

使用異步。如果你發現某些東西你不能使用async,那麼繼續使用TPL。如果那不清楚。這應該被選爲答案,因爲它是一個清晰簡明的解釋。 – BentOnCoding

-1

我的猜測是內部.Net TPL和異步,使用線程池線程。異步可能是傳統的BeginXXX/EndXXX模式的簡化語法。

但更重要的是TPL使用線程池線程,並且不應該將它用於執行昂貴的操作,因爲框架本身使用相同的線程。如果你有昂貴的操作(如你所提到的),那麼最好創建一個新的獨立線程,或者在使用TPL時將ThreadSchedular的「LongRunning」屬性設置爲。

+4

昂貴的I/O!=昂貴的CPU –

0

@Pawan關於BeginXXX/EndXXX:我認爲你在混合這些東西。 尋找到C#,有運行的並行代碼的3種不同的patterns

  • 推薦使用:異步編程模型(APM)
  • 推薦使用:基於事件的異步模式(EAP)
  • 截至到日期:基於任務的異步模式(TAP)

TPL是構建TAP的基礎。 TPL在.NET 4中引入。儘管TPL和TAP在Microsoft文檔中以某種方式使用同樣的方式。無論哪種方式,async/await都只是C#5引入的一種語言特性,意思是.NET 4.5,以簡化的方式支持TPL。

The BeginXXX/EndXXX belongs to the APM style!所以它與TPL沒有任何關係。這些多個版本使得難以保持概述。