

お世話になります。  
C#のtaskで、合計10個のtaskをRunさせたいと思っているのですが、  
デバッグするとtaskが4、5個は走るのですが、残りが走らずにwaiting状態となってしまいます。  
内容として、同一のメソッドを一つのインスタンスを用いて繰り返し走らせようとしています。  
スレッドプールの上限や下限を見ても問題はないはずなのですが、  
理由や解決策が見つからない状態です。  
よろしくお願いします。

以下に簡潔なソースを書かせて頂きます

[code]

    // 10個スレッドを生成する箇所
    TaskWork taskWork = new TaskWork();
     for (int i = 0; i < 10; i++) {
        Task.Run(() => taskWork.Work());
    }
    
    // task処理するクラスメソッド
    public class TaskWork
    {
      public void Work() {
        while(true) {
          // taskで繰り返す処理
        }
      }
    }
    
[/code]


CC BY-SA 3.0
2017-03-13T04:50:29.037
33284
2017-03-14T09:00:30.687
2017-03-13T06:32:11.603
5750
20665
question
c# .net マルチスレッド
task処理にて、いくつかのtaskの処理が走らない事象について


Taskは結果を得るための一連の処理を表す概念です。例えばStream.ReadAsync()はread結果を得るためのタスクを返します。そしてTaskの実行方法については規定されておらず、.NETランタイムが効率が良いと考える方法で実行されます。  
その際、基本的にはTaskは短時間で完了すると仮定し、不用意に多数のTaskを並列実行しません。もし、長時間実行するTaskなのであれば作成時に[TaskCreationOptions.LongRunning](https://msdn.microsoft.com/ja-
jp/library/system.threading.tasks.taskcreationoptions\(v=vs.110\).aspx)を指定することでランタイムにTaskの性質を通知すべきです。

コードが提示されたので

[code]

    // 10個スレッドを生成する箇所
    TaskWork taskWork = new TaskWork();
    for (int i = 0; i < 10; i++) {
        //Task.Run(() => taskWork.Work());
        Task.Factory.StartNew(() => taskWork.Work(), TaskCreationOptions.LongRunning);
    }
    
[/code]

としてはどうでしょうか。

ただし、そもそもTaskの概念を理解しておらず、ThreadもしくはThreadPoolの代替として選択されているのであれば、Taskではなく適切なクラスを使用することをお勧めします。


CC BY-SA 3.0
2017-03-13T05:21:35.440
33287
2017-03-14T08:29:24.777
2017-03-14T08:29:24.777
4236
4236
33284
answer


タスクで実行している内容に問題があります。

端的に言えばCPUコア数と同じ4タスクを開始した時点でCPUを100%使ってしまい、他の処理が行われる余地が非常に少ないためにタスクの起動が非常に遅くなっています。(まったく実行されないわけではありません)

ですので`TaskWork.Work`の中で他のスレッドに実行機会を譲るために`Thread.Sleep`を指定してやる必要があります。

[code]

    while (true)
    {
        // taskで繰り返す処理
        Thread.Sleep(1000); // 1秒間スリープする
    }
    
[/code]

スリープ時間はミリ秒で指定します。出来るだけCPU時間を譲りたくない場合は`0`とすると必要時のみスリープが行われます。


CC BY-SA 3.0
2017-03-13T06:27:29.157
33289
2017-03-14T09:00:30.687
2017-03-14T09:00:30.687
5750
5750
33284
answer