【发布时间】:2011-11-27 21:12:35
【问题描述】:
我有一个启动各种对象(类库)的 C# Windows 服务。这些对象中的每一个都有自己的“处理”逻辑,它们使用ThreadPool 启动多个长时间运行的处理线程。我有一个例子,就像这样:
System.Threading.ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(WorkerThread_Processing));
这很好用。我的应用运行正常,我的线程运行良好。
现在,对于回归测试,我正在启动这些相同的对象,但从 C# 控制台应用程序而不是 Windows 服务启动。它调用了完全相同的代码(因为它调用了相同的对象),但是WorkerThread_Processing 方法在开始前最多延迟 20 秒。
我已经进去并从ThreadPool 切换到Thread,问题就消失了。这里会发生什么?我知道我没有超过 MaxThreads 计数(我最多启动 20 个线程)。
【问题讨论】:
-
这绝对不应该发生,也不会发生在我身上。您的控制台应用程序是否在做其他事情?如果您创建一个全新的控制台应用程序并输入
ThreadPool.QueueUserWorkItem(o => Console.WriteLine("test"));,它会做同样的事情吗? -
此外,如果您想查看 ThreadPool 正在做什么,我建议您运行 Process Explorer 并密切关注进程中的线程。您可以看到有多少线程池线程正在启动。如果您的操作需要很长时间才能完成,则可能需要一段时间才能增加到 20 个线程。
标签: c# multithreading console-application