2016-12-10 8 views
0

3つのタスクでforeachループを作成する必要があります。これは、3つのタスクがすべて終了して次のタスクに移動するまで待つ必要があります。 何か foreach loop with Task

foreach (class r in sets) 
{ 
    Task.Factory.StartNew(() => { 
     DoThisFunction1(); 
    }, TaskCreationOptions.LongRunning); 
    Task.Factory.StartNew(() => { 
    DoThisFunction2(); 
    }, TaskCreationOptions.LongRunning); 
    Task.Factory.StartNew(() => { 
    DoThisFunction3(); 
    }, TaskCreationOptions.LongRunning); 
} 

のような誰かがこれを行うにはどのように簡単な方法を与えることができますか?

答えて

5

あなたは何の戻り値の型を持っていないWaitAllを使用することができますし、awaitable Taskを返しますタスクのWaitまたはWhenAllにまねブロックします。

例:

var tasks = new Task[] { 
    Task.Factory.StartNew(() => { 
     DoThisFunction1(); 
    }, TaskCreationOptions.LongRunning), 
    Task.Factory.StartNew(() => { 
     DoThisFunction2(); 
    }, TaskCreationOptions.LongRunning), 
    Task.Factory.StartNew(() => { 
     DoThisFunction3(); 
    }, TaskCreationOptions.LongRunning) 
}; 

Task.WaitAll(tasks); 
// or 
await Task.WhenAll(tasks); 

より詳細な答えは簡単なことhere

+0

を見つけることができますか?うわー、これはいつかこれを探していた...ありがとう! – user3763117

+0

ところで、これは標準的な複製と比較して、非常に低品質の回答です... –

+0

@AlexeiLevenkovあなたが提供したサンプルに従って改善しなければなりませんか? – NtFreX

2
class TasksTest 
{ 
    public void Test() 
    { 
     List<string> sets = new List<string> 
     { 
      "set1", "set2", "set3", "set4", 
     }; 

     foreach (var s in sets) 
     { 
      Console.WriteLine("Set {0}", s); 
      var tasks = new[] 
      { 
       Task.Factory.StartNew(() => {DoThisFunction1();}, TaskCreationOptions.LongRunning), 
       Task.Factory.StartNew(() => { DoThisFunction2(); }, TaskCreationOptions.LongRunning), 
       Task.Factory.StartNew(() => { DoThisFunction3(); }, TaskCreationOptions.LongRunning), 
      }; 
      Task.WaitAll(tasks); 
      Console.WriteLine("End Set {0}\n------------", s); 
     } 
    } 

    void DoThisFunction1() 
    { 
     Thread.Sleep(1000); 
     Console.WriteLine("F1"); 
    } 
    void DoThisFunction2() 
    { 
     Thread.Sleep(1500); 
     Console.WriteLine("F2"); 
    } 
    void DoThisFunction3() 
    { 
     Thread.Sleep(2000); 
     Console.WriteLine("F3"); 
    } 
}