2012-07-06 80 views
0

這就是我理解如何使用的HttpWebRequest使asyncronously請求:如何釋放)的HttpWebRequest異步中止(後連接

用於進行異步Web請求的基本結構是調用BeginGetResponse(),並在啓動一個定時器同一時間。如果響應沒有超時,BeginGetResponse()將調用一個將調用EndGetResponse()並讀取響應的回調方法。如果響應超時,則調用另一個計時器的回調方法,並調用WebRequest.Abort()。

該結構取決於Abort()和EndGetResponse()是排他性的事實。在EndGetResponse()之後調用Abort()基本上沒有效果,並且在Abort()之後調用EndGetResponse()會導致EndGetResponse()拋出異常,然後可以捕獲並處理異常,但是要處理超時。

我的問題是,當我需要每秒向幾個服務提出幾百個請求時,一個服務開始變得非常非常潛在。超時回調可能會在500ms後被調用,並調用Abort(),並且我的程序繼續愉快。但由於該服務在10秒後仍未返回,因此由BeginGetResponse()啓動的第一個線程仍在等待,並且網絡連接資源不可供任何未來請求使用。

有什麼辦法讓超時釋放線程的資源,據說超時?如果沒有,有沒有像Web.config的值,我可以設置將超時在網絡的不同層上的請求比應用程序?

+0

下面是我們最終想出的解決方案: – user779860 2012-07-14 19:08:03

+0

我們最終想出了一個可行的解決方案。我們開始了自己的線程,每個HttpWebReqest都有一個線程,然後在這些線程內調用同步GetResponse()而不是異步BeginGetResponse()。從我們目前可以知道的情況來看,導致WebException被拋出的HttpWebRequest Timeout屬性似乎處理了關閉連接並且不再等待來自服務器的響應。我不確定這一點,但似乎HttpWebRequest不應該異步使用的情況下,需要很多連接到可能非常慢的服務器。 – user779860 2012-07-14 19:53:21

回答

0

free up the resources - 這意味着你的線程應該有一個析構函數/終結器,它釋放它擁有的非託管資源(What exactly are unmanaged resources?)。

+0

BeginGetResponse()啓動它自己的線程,我不控制它。如果我這樣做了,我可以實現一個析構函數釋放網絡連接的線程。問題似乎是,除非響應來自服務器,否則無法結束線程,這可能會導致無限的時間。我正在尋找解決方法。 – user779860 2012-07-07 03:30:57