作成されたタスクは、タスクが作成されたスレッドとは常に別のスレッドで実行されますか?
いいえ、TPL が、関連するタスク作成オプション (またはタスク スケジューラ) が提供されたために、または最適化として、それを作成したのと同じスレッドでタスクを実行できると判断できる場合があります。それ以外の場合、スレッドは何もしません。ただし、これについて心配する必要はありません。TPL がそのコンテキストでコードを実行することを選択したため、UI スレッドをブロックすることになるわけではありません。特にそうすべきだと示さない限り、それは起こりません。すべての意図と目的のために、これは(強制的に発生させない限り)決して発生しないと想定できますが、舞台裏では、気付かないうちに発生する可能性があります。
1 つ、0、または複数のスレッドですか?
デフォルトでは、タスクはスレッド プールで実行されます。スレッド プールに含まれるスレッドの数は、与えられたワークロードによって異なります。それは 1 つで始まりますが、十分な必要性があれば成長し、その必要性がなくなると縮小します。オプションを指定すると、LongRunning
そのためだけに新しいスレッドが作成されTask
ます。custom を指定するとTaskScheduler
、好きなように実行できます。
単一の同じコアで実行されますか?
可能性はありますが、確実ではありません。
たとえば、バックグラウンドワーカーをフリーズさせていると考えてメインスレッドをスリープ状態にすることができるため、知っておくことが重要です。
メイン スレッドをスリープ状態にしても、バックグラウンド ワーカーの動作は妨げられません。これがバックグラウンド ワーカーを作成する要点であり、2 つのタスクが互いに作業を停止することはありません。バックグラウンド ワーカーが進行状況を報告したり、結果を表示したりするために UI にアクセスしようとしたときに UI がブロックされた場合、その時点で UI スレッドが解放されるのを待機していることに注意してください。