2011-02-10 31 views
3

爲了優化某些服務器端數據庫調用,我決定使用System.Threading.Tasks.Task來並行化幾個數據庫調用,然後使用Task.WaitAll()獲取所有結果,將它們打包並通過WCF將它們發送給客戶端。當在Visual Studio(cassini)中對開發Web服務器進行測試時,這似乎工作正常,但在部署到IIS時不起作用。分析客戶端調用(使用螢火蟲)顯示調用到IIS,但沒有相應的調用提交給SQL Server。使用來自WCF的TPL任務

任何人都遇到過這個問題?在IIS中使用任務是否存在限制?

回答

3

沒有直接限制 - 但是,當您使用任務時,它會調度ThreadPool上的任務。默認情況下,IIS爲整個IIS進程共享一個單獨的線程池,這可以(特別是在繁忙的服務器上)導致發生線程匱乏。這意味着有關使用ThreadPool的相同指導適用於處理任務時。請參閱this post for details

爲了看看是否有這個問題,至少作爲測試,您可以使用TaskCreationOptions.LongRunning提示生成所有Task實例。這將導致默認TaskScheduler在它自己的專用(新)線程上創建任務,而不是使用ThreadPool線程。雖然我不認爲這是一個長期解決方案的好主意,但您可以驗證它是導致您的問題的線程池匱乏。如果是,則可以確定其他選項,例如可能使用自定義TaskScheduler來管理此操作的線程/任務。

+0

謝謝里德 - 一些很好的信息。我非常有信心這不是線程匱乏,但我需要做更多的調查。我將繼續發佈我的發現。 – 2011-02-11 14:09:31