IHttpAsyncHandler意味着异步运行请求。
使用线程池也可以异步运行。
所以,如果我想实现一个函数(比如Comet,长轮询),在使用IHttpHandler的线程池和使用IHttpAsyncHandler之间,哪个更好?
编辑:@Jon Skeet:感谢您的耐心回复。让我来做个总结。如果我在IHttpHandler中使用delegate.BeginInvoke,则处理请求的“主线程”仍然保持旋转,直到请求结束,无论池化线程发生了什么情况。如果我使用IHttpAsyncHandler,处理请求的‘主线程’将调用BeginProcessRequest,之后,它将被释放(以处理其他请求)。BeginProcessRequest方法将异步执行某些操作。当异步操作完成时,EndProcessRequest方法将被调用。(或者我们可以说“主线程”将调用EndProcessRequest函数来完成当前请求)。
以上都是我的想法,对吗?
发布于 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。但是,能够有一个正在进行的请求,但没有任何特定的线程与之相关联的要点仍然有效。
https://stackoverflow.com/questions/14012307
复制相似问题