2011-03-08 114 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,這是最大容量。