[英]Asynchronous Delegate Invocation (ADI) vs. Task Parallel Library (TPL)
在閱讀Essential C#4.0時,我在ADI上得到了以下評論:
不幸的是,異步委托調用模式使用的基礎技術是用於分布式編程的遠程開發技術,稱為遠程處理。 盡管Microsoft仍支持使用異步委托調用,並且在可預見的將來它將繼續像今天一樣運行,但是在其他方法(即Thread,ThreadPool和TPL)下,性能特征不是最佳的。 因此,開發人員應該傾向於使用這些替代方法之一,而不是使用異步委托調用API進行新開發。 隨后的高級主題文本中包含對該模式的進一步討論,以便遇到該模式的開發人員可以了解其工作方式。
那么,除了TPL可能會使用尚未開發的最終技術之外,ADI還有TPL沒有的任何限制嗎?
任務和異步委托都使用線程池。
在可以將異常傳播到調用方的意義上,任務和異步委托是相似的。 任務更進一步,累積所有拋出的異常,並將它們呈現給所有線程池工作人員。
任務允許取消。
有一個免費的章節詳細介紹了所有這些內容: http : //www.albahari.com/threading/
您要求“限制”。
我認為您不會發現ADI(也稱為APM)無法完成的任何工作。 關鍵是性能和程序員的努力。
判決似乎是一致的, 喬·達菲 ( Joe Duffy)還警告您遠離 ADI / APM
結論很容易,如果可以的話,請使用TPL。 它既簡單又有效。 而且這只是進一步發展的起點。
並不是說我是TPL的專家。 據我了解,TPL將並行性級別上的決策抽象為配置/規范。
例如,在並行for循環中。
Parallel.For(0,1000,a => Thread.Sleep(10000));
您不一定會產生1000個線程。 TPL將“並行化”到適當數量的線程。 與異步調用方法1000次相反。 (這也不會創建1000個線程,但是直到釋放所需的資源之前,您只會阻塞執行調用。
此外,TPL允許您對並行任務進行更高級別的控制。 在上面的示例中,您可以輕松地暫停/中斷/中止for循環。 如。
Parrallel.For(0,1000,(a,loopState)=> loopState.Break());
使用常規的異步方法調用來實現上述目的有點麻煩。
TL,DR:TPL更加高效且易於使用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.