2012-02-11 108 views
2

我注意到從ExecuteRegisteredAsyncTasks調用返回後的代碼與此調用之前的代碼在相同的線程中執行。所以我明白,手動調用ExecuteRegisteredAsyncTasks不會釋放請求處理線程來處理其他請求,並且只應該自動調用此方法以獲得擴展優勢?ExecuteRegisteredAsyncTasks是否釋放請求處理線程以處理其他請求?

上msdn是示例代碼,但幫助不回答這個問題。

UPDATE

在我的情況下,在PageAsyncTasks我異步調用Web服務(使用開始*和結束*),所以我沒有使用線程池。

回答

4

RegisterAsyncTask方法的MSDN示例中,他們只是聲明一個AsyncTaskDelegate,它使用Begin和End方法調用。當你異步調用委託時,它使用線程池中的一個線程,所以在這種情況下基本上沒有任何改進。唯一的速度改進可能是如果你正在並行執行多個操作,否則會同步執行。

如果你想獲得真正的性能提升,你需要使用IOCP(I/O完成端口)。它們適用於I/O密集型任務,如網絡調用(數據庫調用,Web服務調用...)。不適合CPU密集型任務。因此,我們假設您想要使用WebClient.DownloadStringAsync方法執行HTTP調用。此方法不使用線程池中的線程。它向內核註冊一個IOCP並觸發HTTP請求。當它將控制權返回給調用者時,在整個HTTP請求持續時間內不會消耗線程。一旦請求完成,IOCP就會發出信號,並從線程池中抽取一個線程來處理結果。

看看文章asynchronous pages in ASP.NET。在那裏解釋IOCP更好。

+0

謝謝。查看我的更新。我剛讀過這篇文章,但它沒有回答這個問題。 – Pol 2012-02-11 10:18:10

+0

@Pol,因此如果您使用異步版本的方法調用Web服務,則不使用線程池中的線程。所以要回答你的問題:是的,在這種情況下,請求處理線程在Web服務調用期間被釋放。 – 2012-02-11 10:22:12

+0

無論我直接在我的代碼中調用'ExecuteRegisteredAsyncTasks'還是在頁面處理中自動調用它?在這兩種情況下,Web服務調用期間都會釋放請求處理線程? – Pol 2012-02-11 15:02:10