在HttpWebRequest成功后,我找不到取消/终止异步读取操作的方法。没有办法设置超时,ThreadPool.RegisterWaitForSingleObject也不工作。关闭底层套接字也不是一种选择,因为HttpWebRequest/Reponse都不提供对它的访问。
编辑:
遗憾的是,Sunny suggestet的这种方法只适用于HttpWebRequest.BeginGetResponse。对于您在GetResponseStream()之后获得的流,由于某种原因,RegisterWaitForSingleObject无法工作-回调函数从未被调用过。
情况如下:我得到了一个使用HttpGetRequest的应用程序。它是使用异步httpwebrequest的默认MSDN示例构建的。获得回应就像一种护身符。但在极少数情况下,我的httpwebrequest所连接的服务器会忘记关闭套接字。所以我被挂在了BeginRead的无限读上。
在极少数情况下,其他服务器会忘记
发布于 2008-11-13 22:00:11
为什么不是RegisterWaitForSingleObject呢?您可以将其用于超时,并且可以在处理程序中调用request.Abort()。
这是一个example。顺便说一句,在我发现这篇文章之前,我已经使用了类似的方法,它就像一个护身符。
注意:操作的实际结束将发生在下一个Stream.Read (只有请求/响应是异步的)或Stream.EndRead (如果读取也是异步的情况下)。您仍然需要捕获在EndXXXX处理程序中抛出的异常。
编辑:如果RegisterWaitForSingleObject从未被调用,那么您有另一个问题,这很可能是ThreadPool没有足够的空闲线程。在ThreadPool线程上调用RegisterWaitForSingle对象的回调,如果池中没有空闲线程,则永远不会调用它。您有一些解决方案:
?How.
在任何情况下,增加池大小都不会对您有太大帮助。您必须检查代码中的资源(流)泄漏,并确保不仅调用了request.Abort(),还关闭了响应。确保在回调中使用正确的EndXXX方法,等等。
I nazdrave :)
https://stackoverflow.com/questions/288463
复制相似问题