17

Parallel.For/ForEach ループを実行するときに使用されるスレッドの数を知りたいです。

MaxDegreeOfParallelism オプションで変更できることがわかりました。

MSDN の MaxDegreeOfParallelism ヘルプ (リンク):

デフォルトでは、For と ForEach は基礎となるスケジューラーが提供する多くのスレッドを利用するため、MaxDegreeOfParallelism をデフォルトから変更しても、使用される同時タスクの数だけが制限されます。

しかし、基礎となるスケジューラーが提供するスレッドの数はわかりません。

どうすればそれを知ることができますか?

9999999 回の実行でループをテストできますが、このテストでは数値が表示されますが、その数値を決定するルールは表示されません。

後で編集/追加:

「sheduler max concurrency」をグーグルで検索したところ、(MSDNで-リンクで)そのTashShedulerクラスにMaximumConcurrencyLevelプロパティがあり、次のことがわかりました。

最大同時実行レベルを表す整数を返します。デフォルトのスケジューラは Int32.MaxValue を返します。

その TaskSheduler クラスは、これらの並列ループの「基になるスケジューラ」として使用されますか?

4

1 に答える 1

13

MSDNによると:

Task Parallel Library と PLINQ の既定のスケジューラは、.NET Framework を使用してThreadPool作業をキューに入れ、実行します。.NET Framework 4 では、は型ThreadPoolによって提供される情報を使用して、System.Threading.Tasks.Task並列タスクやクエリが表すことが多いきめ細かな並列処理 (短時間の作業単位) を効率的にサポートします。

のドキュメントを見るとThreadPool、次のように書かれています。

プロセスごとに 1 つのスレッド プールがあります。.NET Framework 4 以降、プロセスのスレッド プールの既定のサイズは、仮想アドレス空間のサイズなど、いくつかの要因によって異なります。プロセスはこのGetMaxThreadsメソッドを呼び出して、スレッドの数を決定できます。メソッドを使用して、スレッド プール内のスレッドの数を変更できますSetMaxThreads

于 2013-09-22T12:36:45.733 に答える