0

を完了していない理由を、私はこのコードを書く:私のスレッドプールのスレッドが同時にメイン機能で

  ThreadPool.SetMaxThreads(200, 200); 

     for (int i = 0; i < 100; i++) 
     { 
      ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadWhichWillCallSQL_test), i); 
      Thread.Sleep(1); 
     } 

とスレッド機能は、以下のようなものです:

 static public void ThreadWhichWillCallSQL_test(Object o1) 
    { 
     Thread.Sleep(5000); 
     Console.WriteLine(DateTime.Now.ToString()); 
     return; 
    } 

出力は次のようになります。

5/25/2017 2:00:01 PM 
5/25/2017 2:00:01 PM 
5/25/2017 2:00:01 PM 
5/25/2017 2:00:01 PM 
5/25/2017 2:00:02 PM 
5/25/2017 2:00:03 PM 
5/25/2017 2:00:04 PM 
5/25/2017 2:00:05 PM 
5/25/2017 2:00:05 PM 
5/25/2017 2:00:06 PM 
5/25/2017 2:00:06 PM 
5/25/2017 2:00:06 PM 
5/25/2017 2:00:06 PM 
5/25/2017 2:00:07 PM 
5/25/2017 2:00:07 PM 
5/25/2017 2:00:08 PM 
5/25/2017 2:00:08 PM 
5/25/2017 2:00:09 PM 
5/25/2017 2:00:09 PM 
5/25/2017 2:00:10 PM 
5/25/2017 2:00:10 PM 
5/25/2017 2:00:10 PM 
5/25/2017 2:00:11 PM 
5/25/2017 2:00:11 PM 
5/25/2017 2:00:11 PM 
5/25/2017 2:00:11 PM 
5/25/2017 2:00:12 PM 
5/25/2017 2:00:12 PM 
5/25/2017 2:00:12 PM 
5/25/2017 2:00:13 PM 
5/25/2017 2:00:13 PM 
5/25/2017 2:00:13 PM 
5/25/2017 2:00:14 PM 
5/25/2017 2:00:14 PM 
5/25/2017 2:00:14 PM 
5/25/2017 2:00:15 PM 
5/25/2017 2:00:15 PM 
5/25/2017 2:00:15 PM 
5/25/2017 2:00:15 PM 
5/25/2017 2:00:16 PM 
5/25/2017 2:00:16 PM 
5/25/2017 2:00:16 PM 
5/25/2017 2:00:16 PM 
5/25/2017 2:00:17 PM 
5/25/2017 2:00:17 PM 
5/25/2017 2:00:17 PM 
5/25/2017 2:00:17 PM 
5/25/2017 2:00:18 PM 
5/25/2017 2:00:18 PM 
5/25/2017 2:00:18 PM 
5/25/2017 2:00:18 PM 
5/25/2017 2:00:19 PM 
5/25/2017 2:00:19 PM 
5/25/2017 2:00:19 PM 
5/25/2017 2:00:19 PM 
5/25/2017 2:00:20 PM 
5/25/2017 2:00:20 PM 
5/25/2017 2:00:20 PM 
5/25/2017 2:00:20 PM 
5/25/2017 2:00:20 PM 
5/25/2017 2:00:21 PM 
5/25/2017 2:00:21 PM 
5/25/2017 2:00:21 PM 
5/25/2017 2:00:21 PM 
5/25/2017 2:00:22 PM 
5/25/2017 2:00:22 PM 
5/25/2017 2:00:22 PM 
5/25/2017 2:00:22 PM 
5/25/2017 2:00:22 PM 
5/25/2017 2:00:23 PM 
5/25/2017 2:00:23 PM 
5/25/2017 2:00:23 PM 
5/25/2017 2:00:23 PM 
5/25/2017 2:00:23 PM 
5/25/2017 2:00:24 PM 
5/25/2017 2:00:24 PM 
5/25/2017 2:00:24 PM 
5/25/2017 2:00:24 PM 
5/25/2017 2:00:24 PM 
5/25/2017 2:00:25 PM 
5/25/2017 2:00:25 PM 
5/25/2017 2:00:25 PM 
5/25/2017 2:00:25 PM 
5/25/2017 2:00:25 PM 
5/25/2017 2:00:25 PM 
5/25/2017 2:00:26 PM 
5/25/2017 2:00:26 PM 
5/25/2017 2:00:26 PM 
5/25/2017 2:00:26 PM 
5/25/2017 2:00:27 PM 
5/25/2017 2:00:27 PM 
5/25/2017 2:00:27 PM 
5/25/2017 2:00:27 PM 
5/25/2017 2:00:27 PM 
5/25/2017 2:00:27 PM 
5/25/2017 2:00:28 PM 
5/25/2017 2:00:28 PM 
5/25/2017 2:00:28 PM 
5/25/2017 2:00:28 PM 
5/25/2017 2:00:28 PM 

すべてのスレッド処理のプロセス全体が、私が理解しているこれらの10秒からほぼ28秒間続きます0スレッドは、おそらく同時に完了することはできませんが、あまりにも多くの時間を持つことはできません。

も私は

ThreadPool.SetMaxThreads(200, 200); 

を設定しているだけで100個のスレッドを割り当てるので、他の人が停止するため、右、任意のスレッドの待機を持つべきではありませんか?ここ

は完全なコードは

 using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Text; 
    using System.Threading.Tasks; 
    using System.Threading; 

    namespace ThreadpoolDelay 
    { 
     class Program 
     { 
      static void Main(string[] args) 
      { 
       try 
       { 
        ThreadPool.SetMaxThreads(200, 200); 

        for (int i = 0; i < 30; i++) 
        { 
         ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadWhichWillCallSQL_test), i); 
        } 
       } 
       catch (Exception e) 
       { 
        Console.WriteLine(e.ToString()); 
       } 

       Console.WriteLine("\nPress ENTER to continue..."); 
       Console.Read(); 
      } 
      public static void ThreadWhichWillCallSQL_test(Object o1) 
      { 
       Thread.Sleep(5000); 
       Console.WriteLine(DateTime.Now.ToString()); 
       return; 
      } 

     } 
    } 
+0

をおよび.NET Framework 4.5 – yangl

+1

一つしかなくて、答えられない、推測することができます問題を確実に再現する良い[mcve]。しかし、 'SetMaxThreads()'は新しいアクティブなスレッドをスレッドプールに追加しません。可能な限り最大値を設定します。したがって、既存の作業項目の時間が長すぎるため、スレッドプールのスレッド数が増えるのを待たなければなりません。テストを2回実行するとどうなりますか?それはあなたが2度目の予想どおりに動作しますか? _あなたは気にしていますか?あなたは実際に100コアマシンを持っていますか? –

+0

こんにちは、私は100コアマシンを持っていませんが、私のマシンは30スレッドをテストするために30スレッドを使用すると、最も早く最新のスレッド終了時間はまだ11秒異なる、私はこれに完全なコードを追加している投稿 – yangl

答えて

1

スレッドがあなたの例では同時に開始されていません。これは、スレッドが同時にスタートになります右SetMaxThreads

ThreadPool.SetMinThreads(200, 200); 

後に次の呼び出しを追加します。これは、Mechanicsを作成するThreadPoolスレッドに関するものです。詳細はThreadPool documentationをお読みください。あまりにも開始時刻を追加するためにあなたのThreadWhichWillCallSQL_test方法更新し、より適切にそれをデバッグする

:私の環境は、Visual Studio 2012で

static void ThreadWhichWillCallSQL_test(object o1) 
    { 
     Console.WriteLine("start:" + DateTime.Now); 
     Thread.Sleep(5000); 
     Console.WriteLine("finish: " + DateTime.Now); 
    } 
+0

働くはい、私は本当に慎重に、他の人のコードをコピーし、組み合わせて、ドキュメントを読んでいない。ありがとうございました 。 – yangl

0

良い質問です。

スレッドプルでのスレッドの実行は多くの要因に依存し、要因の1つはCPUコアです。それは各コアでスレッドを実行し、一度それが別のコアを終了します。

例:4つのコアCPUがある場合。これは同時に4スレッドを並列に入れ、スレッドがそのタスクを終了すると次のスレッドを入れます。メカニズムは正確にはそうではないようなものです。 また、5秒間の遅延(スレッドスリープ)があるので、 の計算は4コアの場合と似ています。(30スレッド/ 4コア)

また、あなたはより多くの情報のためにそこに見ることができます:https://msdn.microsoft.com/en-us/library/3dasc8as(v=vs.80).aspx

+1

本当にありません。プールがスレッドをどのように割り当てるかは、実装の詳細であり、バージョンによって異なる場合があります。合理的には、コアごとに1つのスレッドを割り当てません。 –

+0

はadrinoに同意しますが、マルチスレッドをコアに割り当て、コンテキストを切り替える –

+1

コンテキスト切り替え?はい、もちろん。プールがリクエストごとに1つのスレッドを割り当てた場合、合計実行時間は約5秒になります(オーバーヘッドは無視されます)。コアあたり1つ?より多くのスレッドを割り振り、複雑なポリシーに従って必要に応じて最大OP集合まで新しいスレッドを作成します。短い暮らしのための完全な行動。もちろん、プールを使用して30の長い遅延を割り当てることは、この問題を悪用しますが、それは単なる人工的なものです。 –

関連する問題