3

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

编辑:

遗憾的是,Sunny 建议的这种方法仅适用于 HttpWebRequest.BeginGetResponse。对于您在 GetResponseStream() 之后获得的流,由于某种原因 RegisterWaitForSingleObject 不起作用 - 永远不会调用回调。

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

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

4

1 回答 1

1

为什么不注册WaitForSingleObject?您可以将其用于超时,并且在处理程序中您可以调用 request.Abort()。

这是一个例子。顺便说一句,在我过去找到这篇文章之前,我已经使用了 simial 方法,它就像一个魅力。

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

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

  1. 使您的页面异步。为什么怎么样
  2. 更改池中的最大线程数

无论如何,增加池大小不会对您有太大帮助。您必须检查您的代码是否存在资源(流)泄漏,并确保您不仅调用了 request.Abort(),而且还关闭了响应。确保在您的回调中使用正确的 EndXXX 方法等。

我纳兹德拉夫 :)

于 2008-11-13T22:00:10.550 回答