Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 同步HTTP处理程序和异步HTTP处理程序之间的性能差异_C#_.net_Asynchronous_Httphandler_Synchronous - Fatal编程技术网

C# 同步HTTP处理程序和异步HTTP处理程序之间的性能差异

C# 同步HTTP处理程序和异步HTTP处理程序之间的性能差异,c#,.net,asynchronous,httphandler,synchronous,C#,.net,Asynchronous,Httphandler,Synchronous,同步HTTP处理程序和异步HTTP处理程序之间是否存在性能差异? IHttpHandler vs IHttpAsyncHandler 为什么选择一个而不是另一个 好处是什么?除了管理另一个线程外,没有性能差异 同步更容易编码。发送请求后,线程将冻结,直到返回响应。然后可以用相同的方法处理响应和错误。它易于阅读和调试。如果您在GUI线程中运行此代码,如果您没有快速收到响应,Windows可能会报告您的程序“没有响应” 如果不希望线程冻结,请使用异步。当后台任务等待HTTP响应时,用户可以继续与程序

同步HTTP处理程序和异步HTTP处理程序之间是否存在性能差异? IHttpHandler vs IHttpAsyncHandler

为什么选择一个而不是另一个


好处是什么?

除了管理另一个线程外,没有性能差异

同步更容易编码。发送请求后,线程将冻结,直到返回响应。然后可以用相同的方法处理响应和错误。它易于阅读和调试。如果您在GUI线程中运行此代码,如果您没有快速收到响应,Windows可能会报告您的程序“没有响应”

如果不希望线程冻结,请使用异步。当后台任务等待HTTP响应时,用户可以继续与程序交互。然后,您必须编写代码来管理后台任务,观察它何时完成,处理错误,将这些错误传递回GUI线程,等等。这需要更多的工作,更难阅读和调试,但如果正确完成,最终将是一个质量更好的产品


编辑:更正了同步方法冻结线程,而不一定冻结整个程序。

ASP.NET使用线程池来处理传入的HTTP请求

当调用IHttpHandler时,线程池线程用于运行该请求,同一线程用于处理整个请求。如果该请求调用数据库或其他web服务或任何其他可能需要时间的请求,线程池线程将等待。这意味着线程池线程在可以用来处理其他请求的情况下会花费时间等待

相反,当使用IHTTPassynchandler时,存在一种机制,允许请求注册回调并在请求完全处理之前将线程池线程返回到池中。线程池线程开始对请求进行一些处理。可能对数据库调用、web服务或其他对象调用某个异步方法,然后在该调用返回时为ASP.NET注册要调用的回调。此时,正在处理HTTP请求的线程池线程将返回到池以处理另一个HTTP请求。当数据库调用或其他调用返回时,ASP.NET会在新线程池线程上触发已注册的回调。最终的结果是您没有线程池线程等待I/O绑定操作,您可以更有效地使用线程池


对于非常高的并发性应用程序(成百上千个真正同步的用户),IHttpAsyncHandler可以极大地提高并发性。由于用户数量较少,如果您有很长时间运行的请求(如长时间轮询请求),仍然会有好处。但是,IHTTPassynchandler下的编程更为复杂,因此在实际不需要时不应使用它。

您通常谈论的是同步和异步,这一点太不正确了。Async在总吞吐量方面在基准测试中表现得更好。只是想澄清一下,您是说几个并行异步请求比几个顺序同步请求好吗?我相信。一个同步请求和一个异步请求怎么样?是的,我说的是几个并行的请求。至于单一的情况没有区别,“冻结整个程序”是非常不准确的。只有一个线程在等待时被冻结,但数百个其他线程仍处于活动状态以处理其他HTTP请求。你混淆了windows gui线程和ASP.NET HTTP处理线程。@塞缪尔,你说得对。我是从单线程与多线程的角度来处理这个问题的,而不是异步与同步。感谢@Samuel Neff的回答,你能分享一些链接吗?我可以从这些链接中了解更多关于使用差异的信息。需要把它弄清楚。