非同期/待機機能を最大限に活用して、多数の同時(またはネストされた)タスクを生成するMicrosoft.NETFrameworkアプリケーションについて考えてみます。重要な「フロー」制御はありません。つまり、タスクはほとんど独立しており、互いに完了するのを待たずに、すべてが実行を競います。
タスクをスケジュールまたは実行する方法とタイミング、およびどのスレッドで決定するかを決定するフレームワークコンポーネントは何ですか?
ユーザーコードからそのメカニズムに影響を与える可能性のあるコースは何ですか?
編集
私は私の質問がどこに向けられているかを特定する良い文章を見つけました:
コードがawaitableを待機し、その待機者がまだ完了していないと言った場合(つまり、待機者のIsCompletedがfalseを返す場合)、メソッドは一時停止する必要があります...
ここで説明する時点は、私の質問から1ステップ遅れています。何かがすでにユーザーコードを処理し、awaitableとawaiterを構築し、コンテキストをキャプチャして、タスクを実行する(またはすでに実行している)スレッドを決定している可能性があります。私はその「何か」について尋ねています。
ユーザーコードがフレームワークがたどるルートにどのように影響するかはわかりますが、それらはプログラマー側の外部の「知識に基づいた」決定です。私たちが影響を及ぼし、それを過飽和にする可能性のある各ルートをとるとします...私たちはいくつかの施設に大きな打撃を与えていますよね?たぶん一文の答えはありません...そして、以下の@Stephenの答えでそれを見るのが遅い場合は申し訳ありません-私はあなたの助けに感謝し、掘り続けます。
(関連するトピックのいくつかは、スレッドプール、コンテキストなど、同期/待機の要約の下でより深くなるようです。私はその方向に掘り下げるのですか?)
編集を終了
カスタムTaskSchedulerは(最良の)(唯一の)答えですか?
質問の目的上、リソースの不足(ネットワーク、I / Oの飽和)やビジネス上の理由(人為的な制限)など、スロットルに関する外部の考慮事項は無視します。または、何が実行されているかを追跡しようとするなどして、ユーザーコードのスロットリングをハックします。