2009-11-24 40 views
1

通常我聽說有25個線程在ThreadPool上運行。C#-Findinding主題

當我執行以下命令:

namespace Examples.Delegates 
{ 
    public delegate void InvokerDelegate(); 
    class Discussion 
    { 
     static void Main() 
     { 
      Discussion dis=new Discussion(); 
      InvokerDelegate MethodInvoker=dis.Foo; 
      for(int i=1;i<=30;i++) 
      { 
       MethodInvoker.BeginInvoke(null,null); 
      } 

      Console.ReadKey(true); 
     } 

     private void Foo() 
     { 
      int avlThreads, avlToAsynThreads; 

      ThreadPool.GetAvailableThreads 
      (out avlThreads,out avlToAsynThreads); 

      string Message=string. 
      Format("From ThreadPool :{0} ,Thread Id :{1},Free Threads :{2}", 
      Thread.CurrentThread.IsThreadPoolThread, 
      Thread.CurrentThread.ManagedThreadId, 
      avlThreads); 
      Console.WriteLine(Message); 

      Thread.Sleep(1000); 
      return; 
     } 
    } 

} 

「消息」(即)avlThreads打印490+提供threads.What 被修正,我應該需要做的字符串的第三個參數?

回答

3

隨着時間的推移,線程池中的線程數量發生了顯着變化。

  • .NET 1.0/1.1/2.0/3.0:每個可用處理器有25個工作線程。不確定I/O完成線程。

  • .NET 3.5/4.0:每個可用處理器250個工作線程和1000個I/O完成線程。

(我有一些模糊的記憶,這是要改變.NET 4.0,但MSDN文檔臨時不表示。)

所以我懷疑你在運行雙處理器系統在.NET 3.5或4.0下。

+0

是的,我的是.NET 3.5上的雙處理器 – user215675 2009-11-24 07:57:46

1

我認爲你需要做的更正是read the documentation。 ThreadPool默認每個處理器有250個線程。在.NET框架1.0,1.1和2.0是25,在3.5是250

1

MSDN

線程池具有每可用 處理器

250工作者線程的默認尺寸

所以,如果你的機器是雙核或四核,那麼你有很多可用的線程是正常的。