首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用IHttpHandler和线程池与使用IHttpAsyncHandler

使用IHttpHandler和线程池与使用IHttpAsyncHandler
EN

Stack Overflow用户
提问于 2012-12-23 23:44:41
回答 1查看 963关注 0票数 0

IHttpAsyncHandler意味着异步运行请求。

使用线程池也可以异步运行。

所以,如果我想实现一个函数(比如Comet,长轮询),在使用IHttpHandler的线程池和使用IHttpAsyncHandler之间,哪个更好?

编辑:@Jon Skeet:感谢您的耐心回复。让我来做个总结。如果我在IHttpHandler中使用delegate.BeginInvoke,则处理请求的“主线程”仍然保持旋转,直到请求结束,无论池化线程发生了什么情况。如果我使用IHttpAsyncHandler,处理请求的‘主线程’将调用BeginProcessRequest,之后,它将被释放(以处理其他请求)。BeginProcessRequest方法将异步执行某些操作。当异步操作完成时,EndProcessRequest方法将被调用。(或者我们可以说“主线程”将调用EndProcessRequest函数来完成当前请求)。

以上都是我的想法,对吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-24 01:07:15

不同之处在于,对于真正的异步模型,每个请求根本不需要线程。如果每个请求都有一个线程,那么无论它是否在线程池中,您都将无法处理大量的连接(对于长轮询之类的事情,您需要这样做)。

假设您有10万个客户端,每个客户端都长时间轮询--您真的想要100,000个线程吗?(提示:我怀疑你是否有足够的内存...)

使用真正的异步,您可以通过结束请求来对事件做出反应,而不需要为每个请求设置专用线程。请注意,对于C# 5和.NET 4.5,也有比使用IHttpAsyncHandler更简单的方法。这取决于你想要实现什么,但是WCF和MVC都有面向异步的方法,你可以写一个异步方法,使用await表达式等等。如果你等待一些本身不需要线程的东西(例如一个计时器,或者一些IO完成),那么你可以管理大量的并发连接。

编辑:回答您的进一步问题:是的,如果您只使用IHttpHandler,则必须在ProcessRequest调用完成时完成请求。你不能就这样让它“摇摆”...而在调用EndProcessRequest之前,IHttpAsyncHandler允许请求仍在进行中。但是不要忘记,这是一个非常老的接口--它没有非常清晰的文档记录,我不建议使用它,因为现在有更好的异步方法,特别是使用.NET 4.5和C# 5。但是,能够有一个正在进行的请求,但没有任何特定的线程与之相关联的要点仍然有效。

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

https://stackoverflow.com/questions/14012307

复制
相关文章

相似问题

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