首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >.NET取消流BeginRead

.NET取消流BeginRead
EN

Stack Overflow用户
提问于 2008-11-13 21:48:55
回答 1查看 3K关注 0票数 3

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

编辑:

遗憾的是,Sunny suggestet的这种方法只适用于HttpWebRequest.BeginGetResponse。对于您在GetResponseStream()之后获得的流,由于某种原因,RegisterWaitForSingleObject无法工作-回调函数从未被调用过。

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2008-11-13 22:00:11

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

这是一个example。顺便说一句,在我发现这篇文章之前,我已经使用了类似的方法,它就像一个护身符。

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

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

  1. 使您的页面异步。the max threads in the pool.

How.

  • Change Why

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

I nazdrave :)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/288463

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档