各非同期アクティビティ インスタンスは独自のスレッドで実行されるためです。誰が言う? 確かにドキュメントではありません。
ParallelForEach はその値を列挙し、列挙するすべての値に対して Body をスケジュールします。Bodyのみをスケジュールします。ボディがどのように実行されるかは、ボディがアイドル状態になるかどうかによって異なります。Body がアイドル状態にならない場合、スケジュールされたアクティビティはスタックとして処理され、最後にスケジュールされたアクティビティが最初に実行されるため、ボディは逆の順序で実行されます。
たとえば、ParallelForEach に {1,2,3,4} のコレクションがあり、WriteLine を本体として使用して値を書き出すとします。コンソールに 4, 3, 2, 1 が表示されます。これは、WriteLine がアイドル状態にならないためです。そのため、4 つの WriteLine アクティビティがスケジュールされた後、それらはスタック動作 (先入れ後出し) を使用して実行されました。
実行の並列性は、アクティビティがブックマークを作成してアイドル状態になったときにのみ発生します。それでも、実際には 2 つのアクティビティが同時に実行されているわけではありません。1 つまたは複数のアクティビティが実行を停止したため、他のアクティビティが順番に実行されます。名前からして紛らわしいのは当然ですが、それだけです。
いずれにせよ、フレームワークによる並列処理に依存している場合は、フレームワークが使用しているスレッドの数を気にする必要はありません。彼らはおそらくすべてをコントロールしています。そうでないことがわかるまで。