1

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

有趣的是,如果我在同一台机器上的两个进程之间分配工作,一切都会完美运行。.net 框架或 Windows 中的每个进程是否有线程限制?或者为什么我会出现这种行为?会不会是网络相关的问题?我正在运行 Windows 7 Ultimate,并且我已经尝试了具有相同行为的 VS2010 和 VS 2012。

4

5 回答 5

4

300个线程是愚蠢的。

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

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

如果 2 个单独的进程执行得比 1 好,那么可能不是上下文切换,而是内存使用或连接限制阻碍了你。

于 2012-09-27T12:39:52.740 回答
4

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

于 2012-09-27T12:28:55.170 回答
1

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

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

于 2012-09-27T12:38:03.883 回答
0

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

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

于 2012-09-27T12:40:16.540 回答
0

这个问题的公认答案可能会解释正在发生的事情,但对于任何正常的应用程序来说,300 个线程似乎是一个好主意。

于 2012-09-27T12:31:20.710 回答