質問: new Thread( new ThreadStart( method3 ) ); ....スレッドをいっぱい生成....開始 thread1.start(); thread2.start(); thread3.start(); } void method1 (){ while(true){ アプリが起動している間だ、ずっと動作し続ける } } void method2 (){ while(true){ アプリが起動している間だ、ずっと動作し続ける } } ```
回答: Threadは処理の流れを表すものです。対してTaskは結果を得るための一連の処理であり、Resultプロパティを持ちます(結果がない場合はありませんが)。このように両者は異なる概念であり優劣を比較するのはナンセンスです。 その上でThreadについて、長時間実行する処理と短時間で完了するが多数生成される処理とがあります。短時間の処理に対してThreadを1つ1つ生成・破棄を繰り返していては効率が悪いため、一定数蓄えるThreadPoolというものも用意されています。 構造から明らかではありますが、短時間に複数実行する処理については、Threadを生成・破棄を行うよりもThreadPoolを使用し完了しても破棄せずプールに返す方が軽いと言えます。 さてTaskは結果を得るための処理ですので基本的には短時間で完了する処理であると想定されます。そのためTaskは基本的には内部処理としてThreadPoolを使用しています。 以上を踏まえて > > 基本的にはスレッドよりタスクの方が軽いと言うことですが > > > 無条件に軽いわけではありません。前提条件も併せて理解してください。 > > アプリが起動している最中はずっと動作しっぱなしのスレッドを作るプログラムがあるのですがこういった場合もタスクに書き直した場合は動作が軽くなるのでしょうか > > > 動作しっぱなしの処理については大差ありません。むしろThreadPoolを占有し続けることによる弊害もあり得ます。 > > CPUが複数コアだった場合は、スレッドでもタスクでも空いているコアに割り当てられるのでしょうか > > > 空いていれば割り当てられます。