我们遇到的情况是,我们正在使用ThreadPool.QueueUserWorkItem()API从作业队列中的for循环中生成多个线程来执行一些文件复制操作。作业队列包含大约50个项目(用于测试目的)。
我们期待最大数量没有。当系统无法保留多个线程(使用更高的工作负载)时,会产生50个线程进行处理,甚至更少。但是当我们打印出来的时候。使用ThreadPool.GetAvailableThreads(out _iWorkerThreads,out _ioThreads)中池中的可用线程,我们得到一个常量1023(工作线程的作业大小为50),而没有I / O线程的数据。
不确定为什么会产生如此多的线程。 ThreadPool.GetAvailableThreads的输出是否可靠?是否有助于在线程池中设置最大线程数?什么是评估平均值的可靠方法。来自池的进程使用的托管线程?
任何人都可以指出为什么当应用程序运行时CPU利用率几乎达到100%。代码使用WaitHandles(通常为ManualResetEvents)附加到每个作业,以通知主线程完成作业。
答案 0 :(得分:4)
这不是衍生线程的数量。这是在达到最大值之前可以生成的其他线程数。
MSDN:ThreadPool.GetAvailableThreads Method
GetMaxThreads减去GetAvailableThreads可能是你要找的号码。
不做任何事情:
class Program
{
static void Main(string[] args) {
int workerThreads, completionPortThreads;
ThreadPool.GetAvailableThreads(out workerThreads, out completionPortThreads);
Console.WriteLine(workerThreads);
Console.WriteLine(completionPortThreads);
Console.ReadLine();
}
}
输出结果为:
1023
1000
如果您确定在知道某些线程仍在工作时调用ThreadPool.GetAvailableThreads,则该数字应该更低。
示例:
static void Main(string[] args) {
int workerThreads, completionPortThreads;
ThreadPool.GetAvailableThreads(out workerThreads, out completionPortThreads);
Console.WriteLine(workerThreads);
Console.WriteLine(completionPortThreads);
Console.WriteLine();
ThreadPool.QueueUserWorkItem(o => Thread.Sleep(10000));
ThreadPool.GetAvailableThreads(out workerThreads, out completionPortThreads);
Console.WriteLine(workerThreads);
Console.WriteLine(completionPortThreads);
Console.ReadLine();
}
输出结果为:
1023
1000
1022
1000