2011-04-01 40 views
0

如果我使用System.Threading.Task運行並行任務是這樣的:System.Threading.Task等待疑問

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(); 

威爾t.Wait()塊下一條語句。

如果我在一個循環中啓動幾個任務,並且希望以循環中的任務不會阻止彼此而是循環被阻止後的所有內容等待它們。

我使用下面的結構:

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 

編輯: - 在最終的形式,我使用下面的行,而不是最後foreach循環。

Task.WaitAll(tasks.ToArray()); 

回答

1

如何:

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

很好的建議。 Ids來自datatable,明天會嘗試。我不需要'ToArray',但我可能需要支持取消。 – TheVillageIdiot 2011-04-01 17:52:43