2008-09-08 62 views
8

你在asp.net中必須小心哪種多線程問題?asp.net中的多線程

+0

+1好問題 – Nick 2009-06-30 14:16:47

+0

關於問題的權威性博客(儘管是日期)是Phil Haacks http://haacked.com/archive/2011/10/16/the-dangers-of-implementing-recurring-background-tasks- in-asp-net.aspx /運行Quartz.NET和HangFire等後臺進程的框架很多。如果你能忍受90秒的限制,你甚至可以使用QueueBackgroundWorkItem。如果你使用Azure,Web Jobs或雲服務。 – RickAndMSFT 2014-08-20 00:06:27

回答

0

程序化緩存是我立即想到的一個領域。這是一個很好的功能,需要謹慎使用。由於它是跨請求共享的,因此在更新它之前必須鎖定它。

我會檢查的另一個地方是任何代碼訪問文件系統,如寫入日誌文件。如果一個請求對文件具有讀寫鎖定,則其他併發請求如果處理不當,將會出錯。

6

有一件事需要注意的事情過期(我認爲httpContext做的),如果你使用它作爲「火和忘記」的操作記住,如果asp.net清理代碼運行之前突然您的操作完成後,您將無法訪問某些信息。

2

如果這是一個Web服務,你應該考慮線程池。太多的線程會讓您的應用程序停滯不前,因爲它們最終會開始競爭CPU時間。

這是文件還是網絡IO?如果是這樣,你還應該考慮使用asynchronous IO。編程可能會更加痛苦,但您不必擔心會一次產生太多的線程。

9

從ASP.NET頁面的代碼隱藏產生線程是有風險的,因爲工作進程偶爾會得到回收,線程將會死亡。

如果由於網頁上的用戶操作而需要啓動長時間運行的進程,最好的方法是在MSMQ中關閉一條消息,並使用單獨的後臺服務監視隊列。只要服務完成任務,服務就可以完成,網頁幾乎可以立即完成工作。你可以通過異步調用web方法來完成同樣的事情,但不要依賴Web方法完成工作時的響應。從代碼隱藏的角度來看,它需要是一個快速而又容易忘記的問題。

0

IIS配置中是否沒有25個線程總數的限制?我相信至少在IIS 6中。如果你超過這個限制,有趣的事情(閱讀:loooooooong響應時間)可能會發生。

0

根據您的需要,就多線程而言,您是否考慮過來自客戶端的產卵請求。使用AJAX產生請求是安全的,然後在回調中處理結果。或者使用一種服務作爲後臺機制,每隔X分鐘運行一次,並以這種方式在後臺運行進程。