我开发了一个 c# .net 4 应用程序,它每天对组织中的每台计算机(超过 70,000 台)执行 WMI 查询。由于与此线程无关的原因,我无法从服务器运行该应用程序,而是从我的 Windows XP SP3 机器运行。该应用程序使用带有新线程的线程池供每台计算机进行查询。我的问题是,在应用程序运行一小段时间后,我用尽了所有可用的 TCP 连接,导致“RPC 错误”。我能够解决这个问题的一种方法是在查询运行后让每个线程休眠 120 秒。这个特殊的解决方案让我感到沮丧,因为在大多数情况下,查询的执行和结果的处理都在 5 到 10 秒内完成,但我必须有意地限制每个线程。该应用程序运行了 15 多个小时,而不是每个线程未被限制时的一小部分时间。关于如何解决此问题的任何更好的想法或建议?
最佳答案
The app uses the threadpool with a new thread for each computer to query.
糟糕的设计。如果切换到一个队列,其中有特定数量的线程在这里处理项目,我会切换。例如,IIS 就是这样做的。
您可能会在某处公开打开的连接数(XP 向我尖叫 32 位 - 这是非常有限的)。
使用队列和较少的线程可以避免资源耗尽。
关于c# 多线程应用程序中的 TCP 耗尽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22471516/