2012-09-16 73 views
0

情況:用於去耦的異步處理天青Web角色 - Monitor.Wait和線程starvation

  1. 接收請求
  2. 地方請求有效載荷到一個隊列:一個高規模天青IIS7應用程序,它必須執行此
  3. 保持連接到客戶端
  4. 等待異步過程已完成
  5. 響應客戶端的通知

請注意,這些將是長時間運行的過程(30秒到5分鐘)。

如果我們在這裏使用Monitor.Wait(...),等待從異步進程到同一個Web應用程序的回調,以調用Monitor.Pa ...()對我們調用Monitor.Wait (),這是否會在短時間內有效地創建線程匱乏?

如果是這樣,該如何緩解?在這裏等待回調是否有更好的模式?例如,我們可以將Response對象放在線程安全的字典中,然後以某種方式讓步,讓回調代碼鎖定Response並繼續響應客戶端?如果是這樣,怎麼樣?

另外,如果異步進程死亡並且從不調用回調,從而不會導致Monitor.Pulse()觸發?我們的線程現在掛了嗎?

+2

爲什麼你不看AsyncPage/AsyncController呢? – astaykov

+0

謝謝。根據你的建議,我們考慮了這一點,這絕對是一條路。我們的新挑戰是Azure主題上的100個併發連接限制,所以我們只需要啓動更多主題。你能做出這個答案嗎?如果你這樣做,我會檢查這個盒子。 –

回答

1

考慮到您的要求,我建議看看AsyncPage/AsyncController(取決於您使用ASP.NET WebForms還是ASP.NET MVC)。這些使您可以在IIS中執行長時間運行的任務而不會阻塞I/O線程。