2010-11-29 228 views
0

我在ASP.NET MVC中實現Comet。我使用了一個定時器來保持服務器中的異步請求。當計時器在1分鐘後過去並向客戶端發送響應(以避免404錯誤)並重新連接到異步控制器時,異步請求將完成。爲什麼在異步操作完成之前不會執行同步操作?

我也想執行而異步請求,拿着一些同步動作,但問題是:

  • 當被執行,通過使用定時器保持一個異步操作,同步動作不叫直到異步動作(Comet long-live request)完成

我用Firefox 3.6多次測試過,但結果總是一樣的;這太奇怪了。你知道爲什麼嗎?

我有一個子問題:

  • 爲了實現彗星,使用計時器(響應之後一些分鐘的經過)或螺紋(幾個時間睡覺螺紋後響應)來保存異步請求;哪個更好?
+0

給我看錢...呃源代碼。 – 2010-11-29 03:12:58

回答

0

我找到了我的問題的答案。
首先,爲什麼同步操作未被執行,而異步操作持有,因爲會話請求塊機制,Asp.net會話塊請求使得所有請求都將被逐個處理,即使您使用Ajax併發請求異步呼叫。並且解決方案是在要控制長時間請求的控制器上禁用會話。這裏是詳細的解釋:https://blogs.msdn.com/b/rickandy/archive/2009/12/17/session-less-mvc-controller.aspx
第二,當執行持有長時間請求時,使用定時器和線程休眠並不不同,因爲Asp.net線程池本質上會創建新的線程來跟蹤已過去的時間並回調到您的定時器已用完事件。它會減少線程池中服務請求的線程數,因爲它生成了新線程來跟蹤定時器事件。