2011-04-01 4 views
0

Si j'utilise System.Threading.Task pour exécuter des tâches parallèles comme ceci:System.Threading.Task Attendez doute

Func<MyResult> func=ComputeResult; 

var t = Task.Facroty.StartNew<MyResult>(ComputeResult, 1);//1 is some id 
t.Wait(); 
var tt = Task.Facroty.StartNew<MyResult>(ComputeResult, 2); 
tt.Wait(); 

Will t.Wait() bloc instruction suivante.

Si je commence quelques tâches dans une boucle et que je veux les attendre toutes de telle sorte que les tâches à l'intérieur de la boucle ne se bloquent pas, mais une instruction après que la boucle soit bloquée.

J'utilise construction suivante:

var tasks=new List<Task<MyResult>>(); 

Func<MyResult> func=ComputeResult; 

for(int i=0; i<10;i++) 
{ 
    var t=Task.Facroty.StartNew<MyResult>(ComputeResult, i); 
    tasks.Add(t); 
    //t.Wait(); //SHOULD I CALL WAIT HERE? 
} 

//OR THIS BETTER OR EVEN IF THIS WORKS 
foreach(var t in tasks) 
{ 
     t.Wait(); 
} 

//do other stuff 

EDIT: - En forme finale, je suis en utilisant la ligne suivante au lieu de la dernière boucle foreach.

Task.WaitAll(tasks.ToArray()); 

Répondre

1

Que diriez-vous:

Task.WaitAll(
    Enumerable 
     .Range(1, 10) 
     .Select(x => Task.Factory.StartNew(arg => 
     { 
      // Do the task here 
      // arg will obviously be the state object x 
      // which will range from 1 to 10 
     }, x)) 
     .ToArray() 
); 
+0

bonne suggestion. Les Ids proviennent de datatable et vont essayer ça demain. Je n'ai pas besoin de 'ToArray', mais je pourrais avoir besoin de prendre en charge l'annulation. – TheVillageIdiot