运行多个线程时程序执行缓慢

时间:2012-09-27 12:25:18

标签: c# multithreading networking

我在C#编写了一个程序,它使用不同的线程完成了很多并行工作。当我达到大约300个线程时,程序的GUI开始变慢并且线程的执行也急剧减慢。线程正在从在不同机器上运行的mySQL数据库读取和写入数据。

有趣的是,如果我在同一台机器上将两个进程之间的工作分开,一切都运行得很完美。 .net框架或Windows中的每个进程是否有线程限制?或者为什么我会这样做?这可能是网络相关的问题吗?我正在运行Windows 7旗舰版,我已经尝试过VS2010和VS 2012同样的行为。

5 个答案:

答案 0 :(得分:4)

处理器时间的分配方式是操作系统为每个进程提供处理器时间,然后每个进程为每个进程提供时间。 因此,两个进程将获得两倍的处理器时间,这就是为什么如果将程序分成两个进程,它的工作速度会更快。 如果要使GUI运行更顺畅,只需为该线程设置更高的优先级。 这样,GUI线程将比其他线程获得更多的处理器时间,但不会太多,以至于它会明显减慢其他线程的速度。

答案 1 :(得分:4)

300线程是愚蠢的。

线程数应该在您的系统支持的核心数(2..8)和/或最大同时连接数(有时只有4个TCP)的范围内。

超越这一点,你只是浪费内存,每个线程1 MB。在32位系统中,300 MB已占用大量可用内存空间。我假设每个线程都附加了一些缓冲区。

如果2个独立进程的性能优于1,则可能不是上下文切换,而是内存使用或连接限制阻止您。

答案 2 :(得分:1)

使用ThreadPool。这应该通过限制存在的线程数量,根据您的系统自动分配最佳线程数。您还可以设置任何一次允许的最大线程数。

此外,如果您要分配线程以在for-loop,foreach-loop或linq语句中并行化任务,那么您应该查看Parallel ClassPLINQ

答案 3 :(得分:0)

接受的答案to this question可能会解释正在发生的事情,但对于任何正常的应用来说,300个线程似乎都是个好主意。

答案 4 :(得分:0)

首先,如果你有一个应用程序的300个线程,那么你可能应该重新考虑你的程序设计。

设置GUI线程优先级可以为您提供更好的GUI性能。但是如果运行这么多线程,操作系统必须在程序堆栈中分配空间。堆栈是内存的连续段。因此,每次创建新线程时,堆栈的已分配内存空间可能无法容纳新线程。然后,操作系统必须在内存中分配更大的连续空间,并将旧堆栈中的所有数据复制到新堆栈。很明显,这可能会导致程序性能下降。