[英]Canceling async httpwebrequests
我正在制作一个将制作多个HttpWebRequest对象的应用程序,并通过httpRequest.BeginGetResponse
方法下载我的html。 我取回IAsyncResult
并将其存储在本地,以便可以随时取消请求,但是我不确定是否正确执行了该请求。
这是我要取消异步Web请求的操作:
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());
}
并且在using (Stream dataStream = httpWebResponse.GetResponseStream())
行上得到了WebException。 内部异常显示诸如“服务器主动拒绝连接”之类的内容。
任何帮助将是极好的!
Abort方法取消对资源的请求。 取消请求后,调用GetResponse,BeginGetResponse,EndGetResponse,GetRequestStream,BeginGetRequestStream或EndGetRequestStream方法会导致WebException,其Status属性设置为RequestCanceled。
因此,您描述的行为是设计使然。 我认为您必须捕获异常,否则必须找到某种方法来确定是否在调用GetResponse,BeginGetResponse,EndGetResponse,GetRequestStream,BeginGetRequestStream或EndGetRequestStream之前调用了Abort。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.