gpt4 book ai didi

timeout - .NET 取消流 BeginRead

转载 作者:行者123 更新时间:2023-12-02 21:28:04 56 4
gpt4 key购买 nike

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

编辑:

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

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

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

最佳答案

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

这是一个example 。顺便说一句,在我过去发现这篇文章之前,我已经使用过类似的方法,而且它非常有效。

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

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

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

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

我是nazdrave:)

关于timeout - .NET 取消流 BeginRead,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/288463/

56 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com