【问题标题】:.NET cancel stream BeginRead.NET 取消流 BeginRead
【发布时间】:2008-11-13 21:48:55
【问题描述】:

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

编辑:

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

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

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

【问题讨论】:

    标签: timeout beginread


    【解决方案1】:

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

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

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

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

    1. 使您的页面异步。 Why? How.
    2. 更改max threads in the pool

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

    我不知道 :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-22
      • 2011-03-28
      • 2019-08-14
      • 1970-01-01
      • 1970-01-01
      • 2017-11-11
      • 2016-03-08
      • 1970-01-01
      相关资源
      最近更新 更多