多线程Web应用程序

时间:2009-09-09 09:39:10

标签: c# asp.net .net multithreading

我知道有很多情况下最好多线程一个应用程序但是 什么时候最好多线程.net网络应用程序?

5 个答案:

答案 0 :(得分:24)

Web应用程序几乎肯定已经被托管环境(IIS等)多线程化了。如果您的页面受CPU限制(并且想要使用多个内核),那么可以说多线程是一个坏主意,因为当您的系统处于负载状态时,您已经在使用它们。

可能帮助的时间是你的IO绑定时间;例如,您有一个需要与3个外部Web服务通信,与数据库通信以及编写文件(所有无关)的Web页面。您可以在不同的线程上并行执行这些操作(理想情况下使用内置的异步操作,以最大化完成端口使用)以减少总体处理时间 - 所有这些都不会过多地影响本地CPU(这里真正的延迟在网络上)。 / p>

当然,在这种情况下,你也可以通过简单地在Web应用程序中排队工作,并让一个单独的服务出列并处理它们来做得更好 - 但是你不能立即向调用者提供响应(他们' d需要稍后再检查以确认完成等。)

答案 1 :(得分:3)

恕我直言,你应该避免在基于网络的应用程序中使用多线程。

也许多线程应用程序可以提高标准应用程序的性能(使用正确的设计),但在Web应用程序中,您可能希望保持高吞吐量而不是速度。

但是如果你有一些并发连接,你可以使用并行线程而不会导致全局性能下降

答案 2 :(得分:2)

多线程是一种为单个进程提供更多处理时间以使其运行更快的技术。它有更多的线程,因此它占用更多的CPU周期。 (从多个CPU,如果你有的话。)对于桌面应用程序,这很有意义。但是,向Web用户授予更多CPU周期会同时从同时处理请求的其他99个用户那里获取相同的周期!从技术上讲,这是一件坏事。

但是,Web应用程序可能会使用其他使用多个线程的服务和进程。例如,数据库不会为连接到它们的每个用户创建单独的线程。它们将线程数限制为几个,将连接添加到连接池以便更快地使用。只要有可用或池化的连接,用户就可以访问数据库。当数据库用完连接时,用户必须等待。

因此,基本上,多个线程的使用可以用于Web应用程序,以减少特定时刻的活动用户数量!它允许系统与多个用户共享资源,而不会使资源过载。相反,用户只需在轮到他们之前排队等候。

这不是Web应用程序本身的多线程,而是Web应用程序使用的服务中的多线程。在这种情况下,它仅作为限制使用,只允许少量线程处于活动状态。

答案 3 :(得分:1)

为了从多线程中受益,您的应用程序必须执行大量可并行运行的工作。如果不是这种情况,多线程的开销可能会带来好处。

根据我的经验,大多数Web应用程序都包含许多短期运行方法,因此除了托管环境已经提供的并行性之外,我会说很少从Web应用程序的各个部分中受益于多线程。可能有一些例子可以提供一个好处,但我的猜测是它并不常见。

答案 4 :(得分:1)

ASP.NET已经能够生成多个线程来并行处理多个请求,因此对于简单的请求处理,很少需要手动生成另一个线程。但是,我遇到了一些不常见的情况,需要创建另一个线程:

  • 如果某些操作可能需要一段时间并且可以与页面处理的其余部分并行运行,则可能会在那里生成辅助线程。例如,如果您因为请求而必须轮询Web服务,则可能会在Page_Init中生成另一个线程,并在Page_PreRender中检查结果(必要时等待)。虽然这仍然是一个问题,如果这将是一个性能优势 - 产生一个线程并不便宜,典型的Page_Init和Page_Prerender之间的时间无论如何都是以毫秒为单位。为此保留一个线程池可能会更有效率,而ASP.NET也有一些称为“异步页面”的东西可能更适合这种需求。
  • 如果您希望定期清理资源池。例如,假设您正在使用一些带有限.NET绑定的奇怪DBMS,但没有池支持(这是我的情况)。在这种情况下,您可能希望自己实现数据库连接池,这将需要一个“更干净的线程”,它会唤醒,比如每分钟一次并检查是否有长时间未使用的连接(和因此可以关闭)。

在ASP.NET中实现自己的线程时要记住的另一件事 - 如果ASP.NET在一段时间内处于非活动状态,它就会扼杀它的进程。因此,你不应该依赖你的线程永远活着。它可能随时终止,你最好做好准备。