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