multithreading - 在高通信場景中在 ASP.NET 中使用 ThreadPool.QueueUserWorkItem的多線程

  显示原文与译文双语对照的内容
100 1

在我印象中,在( 讓我們假設非關鍵) 短的後台任務中使用ThreadPool被認為是最佳實踐,即使在 ASP.NET 中,但我還是遇到了 。但是,我還是想讓你留下線程來處理相關請求。

下面是我一直在做小型非同步任務的方法:


ThreadPool.QueueUserWorkItem(s => PostLog(logEvent))



則建議顯式創建一個線程,類似於:


new Thread(() => PostLog(logEvent)){ IsBackground = true }.Start()



第一種方法具有管理和有界的優點,但是後台任務是( 如果文章是正確的)的ASP.NET 請求處理程序。 第二種方法釋放線程池,但是代價是無限的,因此可能會佔用太多資源。

所以我的問題是,文章中的建議是否正確?

如果你的網站獲得了如這裡多的流量,那麼最好去 out-of-band,或者是完全的線程。

說明:我只是在詢問小型非關鍵任務( 。遠程日誌記錄)的範圍,而不是需要單獨進程( 在這些情況下我同意你需要一個更健壯的解決方案)的貴工作項。

时间: 原作者:

61 2

這裡的其他答案似乎漏掉了最重要的一點:

除非你試圖在低負載的站點上並行化cpu密集型操作,否則 ,否則使用工作線程的時候沒有一點用處。

這對於由 new Thread(...) 創建的免費線程和 ThreadPool 中的輔助線程來響應 QueueUserWorkItem 請求。

是的,它是 true,你不能在一個 ASP.NET 進程中通過排隊過多的工作條目來餓死這個進程。 它將阻止 ASP.NET 處理進一步的請求。 本文中的信息是準確的;用於 QueueUserWorkItem的相同線程池也用於服務請求。

但是,如果你實際上正在排隊的工作項目導致這種飢餓,那麼你應該會餓死線程池 ! 在運行一個工作線程時,如果同時運行數百個cpu密集操作,那麼有另一個工作線程來服務一個 ASP.NET 請求會有什麼好處? 如果你遇到這種情況,你需要完全重新設計 !

大多數時候我看到或者聽到關於 ASP.NET 中不適當使用的多線程代碼,它不是排隊的。 它用於隊列i/o 綁定工作。 如果你想做工作,那麼你應該用一個 I/O 線程( i/o 完成埠) 。

具體地說,你應該使用所使用的任何庫類所支持的非同步回調。 這些方法總是非常清楚地標記;它們以單詞 BeginEnd 開頭。 如 Stream.BeginReadSocket.BeginConnectWebRequest.BeginGetResponse 等。

這些方法不使用 ThreadPool,但是使用 IOCPs,它使用來對 ASP.NET 請求進行干擾。 它們是一種特殊的輕量級線程,可以通過 I/O 系統的中斷信號進行"喚醒"。 在 ASP.NET 應用程序中,通常每個工作線程有一個 I/O 線程,因此每個請求都可以有一個非同步操作排隊。 這就是數百個非同步操作,沒有任何顯著的性能降低( 假設 I/O 子系統可以繼續) 。 這比你所需要的要多。

請記住非同步代理代理不會這樣工作- 它們最終會使用工作線程,就像 ThreadPool.QueueUserWorkItem 。 它僅是. NET 框架庫類的內置非同步方法,它們能夠執行這裡操作。 你可以自己做,但它很複雜,有點危險,可能超出了討論的範圍。

在我看來,最好的回答是不要在 ASP.NET 中使用或者 background後台實例 Thread 。 它完全不像在 Windows 窗體應用程序中旋轉線程一樣,這樣可以保持UI響應性的高效。 從 ASP.NET的角度來說,你的關注點是吞吐量所有的工作線程切換都是絕對的,無論你使用的是 ThreadPool 還是不使用,你的吞吐量都是絕對的。

請在 ASP.NET 中編寫線程代碼- 考慮是否可以重寫前現有的非同步方法,然後真正需要代碼。 在大多數情況下,你可能會增加沒有凈收益的複雜性。

原作者:
92 3

Per,微軟的ASP.NET 團隊的每個人都可以安全地使用 ASP.NET 線程池。

來自文章的:

如果應用程序使用CLR線程,那麼我不會餓死 ASP.NET,這也使用了CLR來執行請求。 引用

用收費的 summarize summarize,不要擔心starving的線程,如果你認為這裡有問題,讓我知道,我們會幫你解決。

我應該創建自己的線程( )? 這對於 ASP.NET 來說不是更好因為它使用了CLR線程。

請不要 。不要用其他方法,不要 ! 如果你真的比聰明,你可以創建自己的線程;否則,你甚至不想。 以下是一些不經常創建新線程的原因:

它比你自己的工作要便宜得多,因為你可以在微軟找工作,因為我們絕對找不到你。 。

原作者:
132 2

網站不應該繞著 spawning 。

通常將這裡功能移到 Windows 服務中,然後與( 我使用MSMQ和他們交談) 通信。

--編輯

我在這裡描述了一個實現: 基於隊列的後台進程在 ASP.NET MVC網路應用中的應用

--編輯

要擴展為什麼這比線程更好:

使用 MSMQ,你可以與其他伺服器通信。 你可以在機器上寫入一個隊列,因這裡如果你確定背景任務在使用主伺服器的資源。

它還允許你批量處理任何你想做的任務,( 發送電子郵件/任何內容) 。

原作者:
...