2013-04-15 34 views
0

使用TPL,我有多個任務設置(動態創建,可能是一個大數目),每個返回一個BOOL,我想檢查是否所有的任務返回值是真實的。我將如何做到這一點?可能嗎?如果沒有,是否有可能將共享對象傳遞給每個任務並讓任務更新此對象?你如何評估多任務的結果

編輯:這將是我的任務的一個例子。 ProcessEntity返回一個布爾值。現在我有多個創建和執行的任務。我需要檢查所有結果是否屬實。

private Task<bool> CreateTask(MyEntity entity, Action onStart, Action onComplete) 
    { 
     return (new Task<bool>(
      () => 
      { 
       onStart.Invoke(); 
       var result = false; 
       try 
       { 
        result = ProcessEntity(myEntity); 
       } 
       catch (Exception ex) 
       { 
       } 

       onComplete.Invoke(); 
       return result; 
      }) 
       ); 
    } 

for (int i = 0; i < counter; i++) 
     { 
      CreateTask(entities[i],() => _taskCounter++,() => _taskCounter--).Start(); 
     } 

所以在這一點上,我需要繼續執行其他代碼,並且只有當所有任務都返回true時纔會發生。

+0

所有這些都是可能的。如果您向我們展示您的代碼以及您嘗試過的方法無效,那麼幫助起來會更容易。 –

+0

[限制TPL任務數量]的重複(http://stackoverflow.com/questions/16012096/limit-number-of-tasks-with-tpl)這似乎是大約相同的問題。而不是創造新的問題來修改當前。你有幾個特定的​​請求。 – Paparazzi

+0

你想同步等待'任務'完成或異步執行嗎?另外,如果某些「任務」失敗會發生什麼? – svick

回答

1

簡單查詢每個Task.Result財產,這都將等待任務完成,並返回結果:

void Main() 
{ 
    var tasks = new List<Task<bool>>(); 

    // spawn all the tasks 
    for (int index = 0; index < 10; index++) 
     tasks.Add(Task.Factory.StartNew(new Func<bool>(GetValue))); 

    // now wait for them to return 
    bool didAllReturnTrue = tasks.All(t => t.Result); 
    // note that if one task returns false, the rest of the tasks will not be 
    // waited upon, and will finish in their own time. 

    // show the results (LINQPad syntax) 
    didAllReturnTrue.Dump(); 
} 

public bool GetValue() 
{ 
    Thread.Sleep(500); 
    return true; 
} 

注意,這不會以任何任務處理異常出色,你將有也可以使用C#5.0/.NET 4.5中的新異步/等待支持,也可以編寫上面的代碼以使其更加異步友好,但我會爲此回答這個問題。

+0

謝謝!我需要先完成所有任務,然後才能訪問結果並繼續進行進一步處理 –