在成功的HttpWebRequest之后,我无法找到取消/终止异步读取操作的方法。没有办法设置超时,ThreadPool.RegisterWaitForSingleObject也不起作用。并且关闭底层套接字也不是一个选项,因为HttpWebRequest / Reponse都不提供对它的访问。

编辑:

可悲的是,Sunny的建议仅适用于HttpWebRequest.BeginGetResponse。对于GetResponseStream()之后由于某种原因而得到的流RegisterWaitForSingleObject不起作用 - 永远不会调用回调。

情况如下: 我有一个使用HttpGetRequest的应用程序。它是使用异步httpwebrequest的默认MSDN示例构建的。获得回应就像魅力一样。但在极少数情况下,httpwebrequest连接的服务器会忘记关闭套接字。所以我挂在BeginRead的无限读取上。

在极少数情况下,其他服务器忘记了

有帮助吗?

解决方案

为什么不注册RegisterWaitForSingleObject?你可以用它来超时,在处理程序中你可以调用request.Abort()。

这是一个示例。顺便说一句,在我过去发现这篇文章之前,我曾使用过simial方法,它就像一个魅力。

注意:操作的真正结束将发生在下一个Stream.Read(只有请求/响应是异步的)或Stream.EndRead(如果读取也是异步的)。您仍然需要捕获EndXXXX处理程序中抛出的异常。

编辑:如果RegisterWaitForSingleObject永远不会被调用,那么你有另一个问题,很可能是ThreadPool没有足够的空闲线程。在ThreadPool线程上调用RegisterWaitForSingle对象的回调,如果池中没有空闲线程,它将永远不会被调用。你有一些解决方案:

  1. 让您的网页异步。 为什么如何
  2. 更改池中的最大线程数
  3. 无论如何,增加游泳池大小对你来说无济于事。您必须检查代码是否存在资源(流)泄漏,并确保您不仅调用request.Abort(),还要关闭响应。确保在回调中使用正确的EndXXX方法等

    我nazdrave:)

scroll top