2011-09-07 116 views
2

我正在開發具有以下要求之一的asp.net mvc應用程序。Asp.net mvc異步處理任務

場景:用戶提交處理長時間運行任務的請求。該任務必須在服務器端啓動。在不等待任務完成的情況下,必須向用戶發送回覆,表示一旦任務完成,他們將收到電子郵件通知。

這似乎是異步處理的場景。最初我想過使用異步委託,但知道異步委託將作爲後臺線程運行,並且在主線程退出時不會保持活動狀態。對我來說,一旦將響應發送給用戶,主線程退出等等作爲後臺線程。糾正我,如果我錯了。

所以我想用Thread類創建一個前臺線程。但在我讀過的其中一篇文章中,提到了asp.net不會考慮它的前景線程與否,並且不會有用。這是真的嗎?

我目前正在尋找以下atlernatives。請建議

  1. 走出asp.net之外的任務處理邏輯,放在控制檯應用程序/服務 並從asp.net推消息,MSMQ通知應用程序。一旦收到消息,控制檯應用程序會做處理,併發送電子郵件通知

  2. WCF服務接收消息並做處理

任何其他更好的想法,請分享

謝謝,

Sveerap

+0

我不知道,但2種解決方案中的任何一種對我來說都很好。 –

回答

0

你可以簡單地使用:

ThreadPool.QueueUserWorkItem(o => 
            { 
             // do something aync 
            }); 

Previous comments on this:

有很多關於飢餓線程請求池論據 這樣做(這是真的),但相反的觀點是,你應該 餓死池,因爲該服務器忙做工作。當然, 理想情況下,您應該完全通過 排隊/分佈式系統等將工作轉移到另一臺服務器上,但這是一個複雜的解決方案。除非 您需要處理數百個請求,您不需要考慮 此選項,因爲它不太可能會導致問題。它真的是 取決於您的解決方案的可擴展性要求,需要多長時間的後臺進程以及調用的頻率。

+0

我認爲ThreadPool.QueueuserWorkItem創建一個後臺線程,並且由於後臺線程在主線程完成後不再存在,它會不會在上面的場景中創建問題? – sveerap

+0

不,它肯定不會,它會從線程池中創建一個新線程,請求線程可以終止。 – TheCodeKing

+0

感謝您的回覆。但是當線程池線程是後臺線程時,我們怎麼能說線程不會終止? – sveerap