Synchronous HTTP Handler和Asynchronous HTTP Handler之间是否存在性能差异? IHttpHandler vs IHttpAsyncHandler
为什么选择一个而不是另一个?
有什么好处?
答案 0 :(得分:28)
ASP.NET使用线程池来处理传入的HTTP请求。
当调用IHttpHandler时,线程池线程用于运行该请求,并且相同的线程用于处理整个请求。如果该请求调用数据库或其他Web服务或任何其他可能需要时间的内容,则线程池线程将等待。这意味着当线程池线程可用于处理其他请求时,它们会花费时间等待事情。
相反,当一个IHttpAsyncHandler时,存在一种机制,允许请求注册一个回调,并在完全处理请求之前将线程池线程返回到池。线程池线程开始对请求进行一些处理。可能在数据库调用或Web服务或其他东西上调用一些异步方法,然后注册一个回调,以便在该调用返回时调用ASP.NET。此时,处理HTTP请求的线程池线程将返回到池以处理另一个HTTP请求。当数据库调用或其他任何内容返回时,ASP.NET会在新的线程池线程上触发已注册的回调。最终结果是您没有线程池线程等待I / O绑定操作,您可以更有效地使用线程池。
对于非常高并发的应用程序(数百或数千个真正同时用户),IHttpAsyncHandler可以大大提高并发性。如果您有很长的运行请求(如长轮询请求),则用户数量较少,仍然可以获益。但是,在IHttpAsyncHandler下编程更复杂,因此在不需要时不应该使用它。
答案 1 :(得分:3)
同步更容易编码。您发送请求并且线程冻结,直到返回响应。然后,您可以在同一方法中处理响应和错误。它易于阅读和调试。如果您在GUI线程中运行此代码,如果您没有快速收到响应,Windows可能会报告您的程序“没有响应”。
如果您不希望线程冻结,请使用Asynchronous。当后台任务等待HTTP响应时,用户可以继续与程序交互。然后你必须编写代码来管理后台任务,观察它是否完整,处理错误,将这些错误传递回GUI线程等等。这需要更多的工作,并且更难以阅读和调试,但最终还是如果做得好,质量更好的产品。
编辑:更正了同步方法冻结线程,不一定是整个程序。