2011-04-02 72 views
2

我正在製作一個應用程序,它將生成幾個HttpWebRequest對象並通過httpRequest.BeginGetResponse方法下載我的html。我找回IAsyncResult並將它存儲在本地,以便我可以隨時取消請求,但我不確定是否正確執行此操作。取消異步httpwebrequests

下面是我在做什麼,以取消異步Web請求:

var res = (RequestState)asyncResult.AsyncState; 
res.Request.Abort(); 

哪裏請求HttpWebRequest類型。

我注意到的是,即使在我調用這些代碼行之後,仍然會在應用程序中打開所有異步線程。如果我在httpRequest.BeginGetResponse(GetResponseCallback, state)(例如方法GetResponseCallback)中調用的代理中設置了一箇中斷點,那麼調試程序在幾秒鐘後會在方法內部中斷,導致在運行該方法時拋出WebException。

只是爲了保持完整性,我GetResponseCallback看起來是這樣的:

using (var httpWebResponse = (HttpWebResponse)request.EndGetResponse(result)) 
using (Stream dataStream = httpWebResponse.GetResponseStream()) 
using (var reader = new StreamReader(dataStream)) 
{ 
    string ret = reader.ReadToEnd(); 
    state.OnComplete(ret, new EventArgs()); 
} 

和我上using (Stream dataStream = httpWebResponse.GetResponseStream())行引發WebException。內部異常說「服務器主動拒絕連接」或類似的東西。

任何幫助將是優秀的!

回答

4

documentation for HttpWebRequest.Abort()

Abort方法取消對資源的請求。取消請求後,調用GetResponse,BeginGetResponse,EndGetResponse,GetRequestStream,BeginGetRequestStream或EndGetRequestStream方法會導致Status屬性設置爲RequestCanceled的WebException。

因此,您描述的行爲是通過設計。我認爲你必須捕捉異常,否則在調用GetResponse,BeginGetResponse,EndGetResponse,GetRequestStream,BeginGetRequestStream或EndGetRequestStream之前,可以找到一些方法來確定是否調用了Abort。