2

.ForEach多くのタスクを開始するループ (TPL) があります。TPL はスレッド プールからスレッドを消費しているので、利用可能なスレッドがなくなったらどうなるのだろうか? スレッドが再び使用可能になるまで、呼び出し元のコードはブロックされますか?

Taskスレッドプールには、作業項目 ( ) がキューに入れられるグローバル作業キューがあることを知っています。そのキューがいっぱいになることはありますか?

私たちの問題は、一部のタスクは長時間 (30 分) 実行され、一部は短時間 (1 秒) 実行されることですが、そのようなタスクは数千にも上ります。TPL は、開始したタスクごとに新しいスレッドを開始しますか? ないと思います。スレッド プールはどの時点で使い果たされますか?

4

1 に答える 1

4

空きスレッドがなくなると、いくつかのアルゴリズムが作動します。主なアルゴリズムは、ThreadPool が余分なスレッドをゆっくりと作成することです (最大 2/秒)。

これは、実行時間の長いタスクの状況に対処するのに役立ちますが、システムは完全ではありません。何百ものスレッドが作成される状況に注意してください。アプリがクラッシュする可能性があります。

最初のアプローチは、ForEach で DegreeOfParallelism を指定することです。numberOfCores * someFactorタスクが実行する I/O に someFactor が依存するスレッドの数を制限したいとします。

カスタム TPL スケジューラーを調査することもできますが、それについてはよくわかりません。

于 2011-10-11T09:00:22.977 に答える