关于C#:程序在运行多个线程时执行缓慢

Program executing slow when running many threads

我已经用C#编写了一个程序,使用不同的线程可以完成许多并行工作。 当我达到大约300个线程时,程序的GUI开始变得缓慢,线程的执行速度也急剧下降。 线程正在从另一台计算机上运行的mySQL数据库读取和写入数据。

有趣的是,如果我将工作分配到同一台机器上的两个进程之间,则一切运行得都很好。 .net框架或Windows中每个进程都有线程限制吗? 还是为什么我会得到这种行为? 可能是与网络相关的问题吗? 我正在运行Windows 7 Ultimate,并且我尝试了VS2010和VS 2012具有相同的行为。


300个线程很傻。

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

超越此限制,您只会浪费内存,每个线程1 MB。在32位系统中,300 MB已经占用了大量可用的内存空间。我假设每个线程都附加了一些缓冲区。

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


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


使用线程池。这将通过限制现有线程数自动根据您的系统分配最佳线程数。您也可以随时设置允许的最大线程数。

另外,如果要从for循环,foreach循环或linq语句中分配线程以并行化任务,则应查看Parallel Class或PLINQ。


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

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


对于这个问题的公认答案可能会解释发生了什么,但是对于任何普通应用程序来说,300个线程对于许多人来说似乎是一个好主意。