线程池中的活动线程号

时间:2011-03-08 18:10:11

标签: c# threadpool

当我写下面的代码时,为什么我会得到像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获得了代码) 好文章!!

4 个答案:

答案 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);