29808


TaskとThreadの使い分けなのですが  
基本的にはスレッドよりタスクの方が軽いと言うことですが  
よほどのことが無い限り、Taskクラスだけを考えておけばいいと言うことでしょうか

下のプログラムのように、アプリが起動している最中はずっと動作しっぱなしのスレッドを作るプログラムがあるのですが  
こういった場合もタスクに書き直した場合は動作が軽くなるのでしょうか

また、CPUが複数コアだった場合は、スレッドでもタスクでも空いているコアに割り当てられるのでしょうか  
それとも、1個のコアのなかでタスクが分割されるのでしょうか

[code]

    void foo1(){
    Thread thread1 = new Thread( new ThreadStart( method1 ) );
    Thread thread2 = new Thread( new ThreadStart( method2 ) );
    Thread thread3 = new Thread( new ThreadStart( method3 ) );
    ....スレッドをいっぱい生成....開始
    thread1.start();
    thread2.start();
    thread3.start();
    }
    
    void method1 (){
    while(true){
    アプリが起動している間だ、ずっと動作し続ける
    }
    }
    
    void method2 (){
    while(true){
    アプリが起動している間だ、ずっと動作し続ける
    }
    }
    
[/code]


CC BY-SA 3.0
2016-10-22T13:05:02.910
29804
2016-10-23T12:48:02.013
2016-10-23T12:48:02.013
49
15047
question
c# visual-studio
C#4.5でのTaskとThread


Threadは処理の流れを表すものです。対してTaskは結果を得るための一連の処理であり、Resultプロパティを持ちます（結果がない場合はありませんが）。このように両者は異なる概念であり優劣を比較するのはナンセンスです。

その上でThreadについて、長時間実行する処理と短時間で完了するが多数生成される処理とがあります。短時間の処理に対してThreadを１つ１つ生成・破棄を繰り返していては効率が悪いため、一定数蓄えるThreadPoolというものも用意されています。  
構造から明らかではありますが、短時間に複数実行する処理については、Threadを生成・破棄を行うよりもThreadPoolを使用し完了しても破棄せずプールに返す方が軽いと言えます。

さてTaskは結果を得るための処理ですので基本的には短時間で完了する処理であると想定されます。そのためTaskは基本的には内部処理としてThreadPoolを使用しています。

以上を踏まえて

> 基本的にはスレッドよりタスクの方が軽いと言うことですが

無条件に軽いわけではありません。前提条件も併せて理解してください。

> アプリが起動している最中はずっと動作しっぱなしのスレッドを作るプログラムがあるのですがこういった場合もタスクに書き直した場合は動作が軽くなるのでしょうか

動作しっぱなしの処理については大差ありません。むしろThreadPoolを占有し続けることによる弊害もあり得ます。

> CPUが複数コアだった場合は、スレッドでもタスクでも空いているコアに割り当てられるのでしょうか

空いていれば割り当てられます。


CC BY-SA 3.0
2016-10-22T14:10:36.970
29808
2016-10-22T14:10:36.970
4236
29804
answer