非同期マルチスレッド(C)のThreadPool

コンセプト

理由は、スレッドプールの誕生:スレッドが強すぎる、あなたはパイプスレッドの数を制御することはできません。

 

オブジェクトの生成と破壊が比較的高いコストが、このオブジェクトはまた、繰り返し使用することができるならば、あなたはプールが必要

、内部プールから取得するために必要な時間をこれらのオブジェクトの多くを保存します;疲れ破壊されないの後、プールに戻さフライ級

パフォーマンスを改善するためのリソースを節約する。さらに、制御の総数は、乱用を防止することができます。

 

スレッドプールのスレッドメソッドを起動します

 

この方法の一つ

 

ThreadPool.QueueUserWorkItem(

 

O => this.DoSomethingLong( "btnThreadPool_Click1"));

 

方法二

 

ThreadPool.QueueUserWorkItem(

 

O => this.DoSomethingLong( "btnThreadPool_Click2")、 " 嘿嘿")。

 

 

 

スレッドプールスレッドの数を取得します。

 

  スレッドプールスレッドの最大数を取得します。

 

ThreadPool.GetMaxThreads(アウトworkerThreads int型、int型completionPortThreadsアウト)。

 

 

 

  スレッドプール内のスレッドの最小数を取得します。

 

ThreadPool.GetMinThreads(intworkerThreadsMinアウト、アウトINT completionPortThreadsMin)。

 

スレッドのスレッドプールの最大数を設定します

 

ThreadPool.SetMaxThreads(8,8); // 設定された最大は、より大きくなければならないCPUのコア数、そうでない場合は無効に設定

 

スレッドプールのスレッドの最小数を設定します。

 

ThreadPool.SetMinThreads(2、2);

 

 

注意:ここでは、スレッドプールスレッドの数は、注意して取り扱う必要があり、時間を設定してくださいグローバル設定されています

たとえば、あなたが唯一の8つのスレッドを実行することができ、その後、スレッドの最大数は8で、プロジェクト全体を設定します。

 

 

 

スレッドプールのスレッドを設定すると、待機します

 

  ManualResetEvent MRE =新しいManualResetEvent(偽);

 

  // ---偽閉じ---設定し、オープン---真--- WAITONEを渡すことができます

 

  --- //真のオープン--resetが閉じWAITONE - ---偽だけ待つことができます

 

  ThreadPool.QueueUserWorkItem(O =>

 

  {

 

      this.DoSomethingLong( "btnThreadPool_Click1");

 

      mre.Set();

 

  });

 

  MrekWaitOne();

 

  Console.WriteLineを( " タスクが完了しました... ");

 

以下は、完全なコード例であります

 

        // ThreadPoolの
        ///  <要約> 
        ///  
        ///  </要約> 
        ///  <PARAM NAME = "差出人"> </ param>の
        ///  <PARAM NAME = "E"> </ param>の
        プライベート ボイドのbutton1_Click(オブジェクト送信者、のEventArgs電子)
        { 


            #region启动线程池
             // 启动ThreadPoolの方式一 
            ThreadPool.QueueUserWorkItem(S => Console.WriteLineを(" のbutton1_Click " ));
            // 启动ThreadPoolの方式二 
            ThreadPool.QueueUserWorkItem(S => Console.WriteLineを(" のbutton1_Click "" );
             #Endregion 

            #region最大値と最小スレッドプールスレッドの取得
            (ThreadPool.GetMaxThreadsをOUT  INT workerThreads、OUT  INT completionPortThreads); 
            Console.WriteLineを($ " このコンピュータは最大workerThreads {workerThreads}、最大completionPortThreadsのcompletionPortThreadsある} {です) ; 

            ThreadPool.GetMinThreads(OUT  INT workerThreadsMini、OUT  INT completionPortThreadsMini); 
            Console.WriteLineを($ " このコンピュータが最小workerThreadsMini {workerThreadsMini}であり、最小completionPortThreadsMini completionPortThreadsMiniあります} { ");
             #Endregionは

            #region、スレッドプール設定処理の数がグローバルであるスレッド)(最大値と最小スレッドプール番号を設定
             // 非同期呼び出しを委託--task - Parrallel -非同期/のawaitすべてのスレッドプールスレッドがあります
             / / 最小値未満のスレッドの最大数は、現在のコンピュータを設定した場合、それが有効ではありません。
            ThreadPool.SetMaxThreads(8。 8。); 
            ThreadPool.GetMaxThreads(OUT  INT workerThreads、OUT  INT completionPortThreads); 
            Console.WriteLineを($ " このコンピュータは最大workerThreads {workerThreads}、{}最大completionPortThreadsのcompletionPortThreadsである" ); 

            ThreadPool.SetMinThreads(11 )。
            (ThreadPool.GetMinThreads OUT  INT workerThreadsMini、OUT  INT completionPortThreadsMini); 
            Console.WriteLineを($ " このコンピュータが最小workerThreadsMini {workerThreadsMini}であるが、最小completionPortThreadsMini completionPortThreadsMini} {である" );
             #endregionの


            #regionを待っスレッドプールスレッドを配置
            ManualResetEvent ManualReset = 新しい新 ManualResetEvent();
             /// / falseが--- ---設定---真--- WAITONEをすることによって開くことができます閉じ
             /// - WAITONE真のオープン/クローズ--reset --- ---偽のだけ待つことができる 
            ThreadPool.QueueUserWorkItemを(S =>
            { 
                この .DoSomethingLong(" のbutton1_Click " ); 
                manualReset.Set(); 
            }); 
            manualReset.WaitOne(); 
            Console.WriteLineをは(" 何かを待って行う" ); 

            #endregion 

        } 
        #regionプライベートメソッド、
         ///  <まとめ> 
        /// プライベート方法は時間がかかり、資源集約的である
         ///  </要約> 
        ///  <PARAM NAME = "名前"> </ PARAM> 
        プライベート ボイド DoSomethingLong(文字列名)
        { 
            コンソール。WriteLineメソッド($ "**************** DoSomethingLongスタート{名前} " + 
                $ " {Thread.CurrentThread.ManagedThreadId.ToString(" 00 " )} " + 
                $ " {DateTime.Now.ToString(" YYYY-MM-DD HH:MM:ss.fff " )} *************** " );
             長い LRESULT = 0 ;
             のためのint型 I = 0を私は1_000_000_000を<; I ++ 
            { 
                LRESULT + = 私; 
            } 
            //Thread.sleep(2000); 

            Console.WriteLineを($ " **************** DoSomethingLongエンド{名前} " + 
                $ " {Thread.CurrentThread.ManagedThreadId.ToString(" 00 " )} " + 
                $ " { DateTime.Now.ToString(" YYYY-MM-DD HH:MM:ss.fff " )} " + 
                $ " {} LRESULT *************** " )。
        } 
        #endregion

 

おすすめ

転載: www.cnblogs.com/JohnTang/p/10991807.html