簡體   English   中英

任務和並行編程 ASP.Net

[英]Tasks and Parallel Programming ASP.Net

是否可以使用 .Net 中的 TPL 庫來封裝調用?

我想做這樣的事情

Task t1 = Task.Factory.StartNew(() => { dynamic result = FacebookApp.Get("me/videos/uploaded", parameters); });

但是我收到一個 HttpContext 錯誤,我假設這是因為 FacebooApp.Get 方法在內部使用它。

如何將對 FB API 的調用包裝到任務中以在服務器上並行運行?

我忘了提到我正在使用 Facebook C# SDK 因此 FacebookApp.Get


已編輯

我一直在觀看 TPL 庫上的一些復數視頻,並采用了下圖中的模式。 正如您所說,主線程來自創建控制器本身,但我仍然需要生成 4 個單獨的網絡任務來並行執行網絡調用。 我通過沒有在第 4 個任務中調用的函數完全不依賴 HttpContext 來修復 HttpContext 錯誤。

對我來說,現在的最終結果是並行編程所承諾的更高性能的方法調用。

如果您調用 Web 服務,並且不想阻塞請求線程,最好使用異步頁面(Web Forms) 或異步控制器(MVC)。 如果您啟動一個Task並需要從該任務返回的值,您仍將等待該操作完成,這仍會阻塞請求線程。

請注意,由於 ASP.NET 默認情況下是多線程的,因此您不應在單個 Web 請求中啟動多個線程。

更新:

有關更多信息,請參閱有關 Web 應用程序中的多線程的 SO 答案

您在上面屏幕截圖中的實現將導致浪費 CPU 資源,特別是 ASP.NET 也使用的線程池線程,同時等待網絡調用完成。 如果您想最大化您的吞吐量,您必須使用不會導致 CPU 線程阻塞的異步 I/O 調用。 為了從中充分受益,您還需要使用@Steven 提到的異步控制器。

但是,不應在 ASP.NET 請求實現中使用多線程的建議並不是真正好的建議,因為它不是那么黑白分明。 確實,ASP.NET 請求本身顯然是在多個線程上執行的,因此從頂部開始已經有很好的並行度,但是如果您要調用涉及 I/O 的其他層,您希望放棄 ASP .NET 線程,而這些 I/O 操作正在發生,以便 ASP.NET 可以在這些 I/O 操作掛起時處理更多請求。

與往常一樣,這取決於實現的細節,但在您的情況下,由於您正在調用 Facebook 之類的東西,我可以告訴您,通過在這些調用上使用異步,您絕對會看到好處。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM