2017-12-22 5 views
0

(特定のタイミングではなく)特定の繰り返し回数で1つのタスクを中断することが可能かどうか疑問に思っていましたか?複数の繰り返しに対して1つのタスクを中断する

たとえば、私はこのタスクの配列を持っており、配列内のタスクの1つを反復でサスペンドしたいとします。ここで、0 < j < 3です。タスクを開始する際に代わりTask.Runを使用しての

int iteration = 0; 
var tasksArray = new Task[NUM_THREADS]; 

for (int j = 0; j < NUM_REPEAT_THREADS; j++) 
{ 
    for (int i = 0; i < NUM_THREADS; i++) 
    { 
     tasksArray[i] = Task.Run(() => 
     { 
      iteration++; 
      Console.WriteLine("Task" + iteration); 
     }); 
     tasksArray[i].Wait(); 

    } 
    iteration = 0; 
} 

Task.WaitAll(tasksArray); 
+3

これで本当に何を達成しようとしていますか?タスクを作成して配列を待つたびに、いつも待っていますか?これはいつもすでに完了していますか?また、正確に '中断'とは何ですか? –

答えて

0

、あなたがコントロールする新しいタスク()とtask.Start()を使用することができます(お使いの場合には0 < J < 3)

Task task = new Task(() => { 
          iteration++; 
          Console.WriteLine("Task" + iteration); 
         }); 
task.Start(); 

タスクは1回だけ起動して実行できます。 2回目にタスクをスケジュールしようとすると、例外が発生します。あなたは()) task.Startを使用する理由がない限り

これは、ユーザーTask.RunやTask.Factory.StartNewに推奨(とtask.Startを使用しない)です。これを行うときの1つは、作成したタスクを条件付きで実行する場合など、タスクの作成を実行から切り離す必要がある場合です。詳細から

https://msdn.microsoft.com/en-us/library/dd270682(v=vs.110).aspx

https://blogs.msdn.microsoft.com/pfxteam/2010/06/13/task-factory-startnew-vs-new-task-start/

また、同期の結果は、タスクが完了するまで待機線の下に。

tasksArray[i].Wait(); 

理想的には、Task.WaitAll(tasksArray)のみを使用してください。すべてのタスクが終了するまで待機します(個々のタスクではブロックされません)

+0

'WhenAll'メソッドでもスレッドをブロックすることなくそれを行うことができます – VMAtm

関連する問題