2011-03-08 117 views
6

当我编写下面的代码时,为什么我会得到可用的线程号码,如1022,1020。 因为我使用线程池,所以我必须获得最多25个线程。线程池中的活动线程号

我猜输出线程数是系统上的可用线程。我需要在我的线程池中获取可用的线程号,在win表单应用程序中。

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) 好文章!

+1

毫无疑问,文章是优秀的,但它是在2006年写的! – Azmeer 2017-01-10 02:03:47

回答

8

因为我正在使用线程池,所以我必须获得最多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完成端口线程。

+0

我将Thread.SetMaxThread设置为10001,之后,每当我运行你的程序时,它显示max线程10001,它的持久性。我没有重新启动我的核心i 5系统。是否有可能在你的系统上将其设置为你提供的数字? – 2013-05-15 14:52:07

+0

我想知道如何在fw 3.5中得到2000个工作线程,而假设它是250个核心(在fw3.5中) - 所以quad = 4这意味着4 * 250 = 1000。(所以这很奇怪,你得到了2000) .....(嗯,也许是超线程的东西?) – 2014-06-07 07:58:46

4

使用ThreadPool.GetMaxThreads得到你想要的。

This article有助于解释您需要了解的关于ThreadPool的所有信息。

+0

看来你可以带领一匹马去水,但有时你应该复制并粘贴它们... – Rory 2015-10-22 23:08:08

+1

@Rory,或者,看起来像这样答案只是一个链接,而应该是一个评论。 – gdoron 2015-10-25 22:39:50

-1
int available; 
int maxLimit; 
System.Threading.ThreadPool.GetAvailableThreads(out available, out maxLimit); 
+1

在这个函数中,available是可用的线程,但maxLimit是可用的完成端口。您需要调用GetMaxThreads来查找maxLimit。 – 2012-10-25 13:01:30

1

我将两个设置为10001,使用ThreadPool.SetMaxThread。之后,每当我运行你的程序时,它显示最大线程10001,其持续。我没有重新启动我的核心i 5系统。

之后,我都设置它为10000000,并且它显示以下螺纹的最大计数

工人:32767的IoCompletion:32767

所以在我的Windows 7的英特尔酷睿i5,这是最大容量。