当我写下面的代码时,为什么我会得到像1022,1020这样的可用线程数。 当我使用线程池时,我必须获得25个最大线程。
我猜输出线程号是系统上的可用线程。我需要在win form application中的线程池中获取可用的线程号。
private void Foo()
{
int intAvailableThreads, intAvailableIoAsynThreds;
// ask the number of avaialbe threads on the pool,
//we really only care about the first parameter.
ThreadPool.GetAvailableThreads(out intAvailableThreads,
out intAvailableIoAsynThreds);
// build a message to log
string strMessage =
String.Format(@"Is Thread Pool: {1},
Thread Id: {2} Free Threads {3}",
Thread.CurrentThread.IsThreadPoolThread.ToString(),
Thread.CurrentThread.GetHashCode(),
intAvailableThreads);
// check if the thread is on the thread pool.
Trace.WriteLine(strMessage);
// create a delay...
Thread.Sleep(30000);
return;
}
非常感谢..
(注意:我从http://www.codeproject.com/KB/cs/AsyncMethodInvocation.aspx获得了代码) 好文章!!
答案 0 :(得分:9)
当我使用线程池时,我必须获得25个最大线程。
每个核心的线程池中的最大线程数随着时间的推移发生了很大变化。它不再是每个核心25个,我怀疑这是你所期待的。
例如,在我使用.NET 4的四核超线程笔记本电脑上运行它,我得到最多32767个工作线程和1000个IO完成端口线程:
using System;
using System.Threading;
class Test
{
static void Main()
{
int worker;
int ioCompletion;
ThreadPool.GetMaxThreads(out worker, out ioCompletion);
Console.WriteLine("{0} / {1}", worker, ioCompletion);
}
}
在.NET 3.5下,我获得了2000个工作线程,仍然有1000个IO完成端口线程。
这不是线程池中实际存在的线程数 - 它是线程池允许自己随时间创建的最大数量。
答案 1 :(得分:5)
使用ThreadPool.GetMaxThreads
获取您想要的内容。
This article有助于解释您需要了解的有关ThreadPool
的所有信息。
答案 2 :(得分:1)
我使用ThreadPool.SetMaxThread将两者都设置为10001。在那之后,我运行你的程序,它显示最大线程10001,其持久化。我没有重新启动我的核心i 5系统。
之后我将它设置为10000000,并显示以下线程最大计数
worker:32767 ioCompletion:32767
因此,在我的Windows 7 Intel Core i5上,这是最大容量。
答案 3 :(得分:-1)
int available;
int maxLimit;
System.Threading.ThreadPool.GetAvailableThreads(out available, out maxLimit);