通ることは開発者によって一般的適用の性能を高めるためにである。 但し、もし使用するなら不正確に通ることは効果の反対の厳密の有することができる。 悪い通る論理は実際に適用を減速できるまたはより悪い、適用を矛盾した例外を持つためにもたらしなさい。 前方に計画し、正しい注意を取れば実際に約しかし心配しているべき多くがない。
このブログのポストはこれらの技術がいかに働くか例の視覚スタジオのプロジェクトの適用提示を含んでいるTechRepublicのダウンロードのPDFの形態でまた利用できる。
ThreadPoolについて
C#では、ThreadPoolは基本的に非同期仕事を動かすのにあなたが使用できる糸のコレクションである。 例えば、10の独立した問い合わせを用いるデータベースを呼ばなければならなかったらThreadPoolに呼出しを掲示してもよい、呼出しは非同期的に実行される。 ThreadPoolはあなたのためのほとんどすべてを扱う-アプリケーション開発者は実行するためにちょうど方法を提供し、糸が利用できるようになるときThreadPoolはそれを実行する。
ThreadPoolが非常に使いやすいが、知ってが有用のトリックおよびある先端があるそれを取扱うとき。
ThreadPoolの使用の流れはそのようなことを見る:
- ThreadPoolが実行される方法を掲示する
- ThreadPoolは遊んでいる糸を待っている
- 遊んでいる糸があるときThreadPoolはあなたの方法を実行するのにそれを使用する
- あなたの方法は実行し、終わる
- ThreadPoolは糸を戻し、他の処理のために使用できるようにする
ThreadPoolへある限界があり、それがあなたの通る必要性すべてへ最適のアプローチではないことわかっているべきである。 タイトルを付けられた「ThreadPoolの下でセクションを限るこれのより多くの情報のために」読みなさい。
ThreadPoolを使用して
ThreadPoolを使用し、仕事に列を作らせるように指示するためにThreadPool.QueueUserWorkItem方法を呼ぶ。 この方法はThreadPoolの糸が利用できるようになるとき方法名前を受け入れ、次にある特定の方法を実行する。 これの簡単な例は図A.で示されている(ダウンロード版はすべての図のための実際のコードを含んでいる。)
Aを計算しなさい
簡単な通ること
この例は10の項目に単に列を作らせることを見ることができるように、各項目に「ID」の価値を渡す。 項目はコンソールにそれからあるデータを印刷する。 これらが非同期的に実行しているので順序で必ずしも印刷しないことに注目しなさい。 執行命令は順序で項目に列を作らせても、保証されない。
このコードについて作るべきもう一つのノートは私達が各糸の例にタイプintの変数を渡していることである。 これはそして私達が私達の糸の重複を得、矛盾した結果を得ることができるである働く-私達がタイプインすればこの同じ状態を参照を使用するべきならのでintsが値のタイプ。
ThreadPoolから伝達し合うこと
いつ糸が知ることを完了した、または糸の状態についての他の情報を必要がある手に入れる何回もある。 これをする複数の方法があるが直接最も容易のおよびほとんどの1つは糸内のでき事を使用し、あなたの適用からのそれらのでき事を予約購読することである。 これのためのコードは図B.を示されている。
図B
目的の糸
この例では私達は10の目的を作成して、OnWorkCompleteのでき事を予約購読する、目的をList<T>に加えて反対しなさい。 労働者のクラスが作成された後私達はリストを通ってそして輪になり、それらの開始()方法を呼ぶ。
開始()方法はThreadPoolを内部的に使用する、従ってforeachの声明は実際にリストの次の目的の開始を()呼ぶ前に仕事を完了するために1つの目的を待っていない。 WorkerClassのクラスのためのコードは図C.で示されている。
図C
労働者のクラス
このクラスはクラスの例のメンバー全員へのアクセスを有するDoWork方法に列を作らせるのにThreadPool.QueueUserWorkItem方法を単に使用する。 DoWork方法は1秒の間それからされる仕事を模倣するために眠り、次にOnWorkCompletedのでき事を離れて発射する。
このタイプの組み立てを使用してあなたの糸を内部に閉じ込め、それらを粒状のコントロールすることを許可する。
倍数は同時に同じ変数のアクセスに通す
あなたが結局に操業に区切られる問題に複数の糸が変数に同時にアクセスすることをあっている。 これのよい例は図D.で示されている。
図D
ロック無し
このコードで私達に10本の糸が完全にタイプ辞書である「データ」変数にアクセスすることをある。 最初に一見はをこのコード良く一見する。 私達は私達がデータ変数を確かめる点検によってそれをかか加える前に含んでいないある特定のキーをするべきであるものをしている。 正常のでは、同期、このコードが連結器なしで働かせる適用。 但し、私達が通ることをもたらす場合このコードは壊れる。
理由は私達が確かめているのに、他の糸ほぼ同時にアクセスしている同じ変数にキーはないことである。 従って2本の糸がキーがないことを確認することは可能、両方渡るであり、次に他によってできない例外は投げられ、1つがキーを加えた後。 Thread.Sleep呼出しはほとんど私達が例外を得ることを保証する。
私達が変数が1本の糸によってだけ一度にアクセスされるべきであるランタイムを言う必要があるこのタイプの問題を修理するため。 これは図E.を示されているロックの()声明の使用によって達成される。
図E
ロックを使用して
このコードと図Dで示されているコード間の唯一の主な違いはロックの()声明である。 ロックの声明はそれに渡される変数を締め、1本の糸だけ変数に一度にアクセスしていることを確かめる。 これは私達がそれを加える前に私達が点検すればキーはないことを、他の糸キーを加えられる保障しない。
通ることが使用中のときこのタイプの機能性を使用することは非常に重要である。 理由は間違いが何倍も開発の間に(容積による)出て来ない、生産環境につかまえられる前にことそれをずっと作ることができる。
ThreadPoolの限界
ThreadPoolの落下は糸の数が有限、利用できるプロセッサ1台あたりの25本の糸に履行を怠ることである。 これは30の仕事に列を作らせれば、最後の5つは実行されることを前にプールから利用できるようになるために糸を待たなければならないことを意味する。 糸の計算の制限マイクロソフトを通り越すことはこの数に重ね書きする方法を開発者に与えた。 SetMaxThreads方法を単に呼び、あなたに利用できるがあることを望む糸の数を渡す。
同じような方法はSetMinThreadsである。 ThreadPoolに実際に遊んでい、待っている仕事を坐らせる糸すべてがない-あなたがSetMaxThreadsに与えられる価値まで要求する糸の数だけを作成する。 従ってそして30本の糸のための必要性を有すると期待すれば、糸30の最小数を作るのにSetMinThreadsを使用したいと思う。
これは必要とされたときThreadPoolがすぐに新しい糸を作成しないので性能を高める; それはある特定の間隔のこれだけをする。 デフォルトでこの間隔は秒の半分である、従って最高の糸の境界に達しなくても糸の作成(およびあなたの適用業務処理の遅れ秒半分のまで)ある場合もある。
パート2
このシリーズの糸の例外を扱う方法をパート2で私はあなたの糸を把握し、示すために幾つかの高度方法を示す。 引続き注目しなさい!







