2011-11-16 77 views
5

在委託上調用BeginInvoke時,該操作在單獨的線程上執行。如果在ASP.NET中調用,它是否使用CLR工作線程?或者它使用IIS工作線程?在ASP.NET中使用委託來處理異步操作

如果是後者,那麼我將需要使用異步ASP.NET模式來確保在CLR工作線程上執行操作。但是如果動作在BeginInvoke結束,我寧願不這樣做。

回答

6

它使用CLR工作線程。

here

要首先描述,ASP.NET使用進程級的CLR線程池來服務請求(在CLR線程池的更多背景,請參見.NET列在這個問題上)。

編輯:

另一個資源是this blog

不幸的是,使用的BeginInvoke線程實際上是從所使用的ASP.Net處理同樣的工作線程池中獲取頁面請求

+0

謝謝。 MVC支持異步模型。看起來如果我和BeginInvoke技術一起使用這個技術,我的頁面將會快速返回並且工作不會佔用IIS工作線程。正確? –

+0

重讀那篇博文,我可以簡單地做一個Thread.Start()技術。對於我的應用程序,我不會有這些過程中發生的任何一個以上(通常只有1個)的風險,所以這可能是我最需要的最簡單/最可維護的解決方案。對於任何沿着搜索博客文章的人來說,「我會使用Thread.Start()並創建自己的線程」。 –

+0

@John你是對的。如果你只想快速返回頁面,而不需要用戶知道結果,那麼它很好。但它不會提高性能。 – Mithir

1

使用自定義委託並調用其BeginInvoke方法提供了一種快速方法來爲應用程序啓動工作線程。但不幸的是,它們會損害應用程序的整體性能,因爲它們使用ASP.NET使用的同一個池中的線程來處理HTTP請求。請記住,如果異步方法的回調很重要,那麼您需要阻止主線程返回客戶端,直到異步過程完成。如果日誌記錄和分析是一個「即忘即斷」的方法調用,那麼事情就會變得更加簡單,您只需啓動該方法並允許服務器響應客戶端即可。但是,如果回調很重要並且服務器已經完成處理,則服務器上沒有任何事情可以處理完成後的回調;這就是爲ASP.NET應用程序服務器上的異步處理與WinForms應用程序不同的地方。