我正在制作一个应用程序,它将制作多个 HttpWebRequest 对象并通过下载我的 htmlhttpRequest.BeginGetResponse
方法。我回来了IAsyncResult
并将其存储在本地,以便我可以随时取消请求,但我不确定我这样做是否正确。
以下是我取消异步网络请求的操作:
var res = (RequestState)asyncResult.AsyncState;
res.Request.Abort();
其中 Request 的类型为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());
}
我得到了 WebExceptionusing (Stream dataStream = httpWebResponse.GetResponseStream())
线。内部异常表示诸如“服务器主动拒绝连接”之类的内容。
任何帮助都会非常好!
来自HttpWebRequest.Abort() 的文档:
Abort 方法取消对资源的请求。取消请求后,调用 GetResponse、BeginGetResponse、EndGetResponse、GetRequestStream、BeginGetRequestStream 或 EndGetRequestStream 方法会导致出现 WebException,且 Status 属性设置为 RequestCanceled。
所以你所描述的行为是设计使然的。我认为您必须捕获异常,或者找到某种方法来确定在调用 GetResponse、BeginGetResponse、EndGetResponse、GetRequestStream、BeginGetRequestStream 或 EndGetRequestStream 之前是否调用了 Abort。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)