2013-04-15 2 views
0

С помощью TPL у меня есть несколько заданий (динамически создается, может быть большое число), каждый возвращает bool, я хочу проверить, истинны ли все возвращаемые значения задачи. как бы я это сделал? Является ли это возможным? если нет, можно ли передать общий объект каждой задаче и обновить этот объект?Как вы оцениваете результат нескольких задач

EDIT: Это будет пример моей задачи. ProcessEntity возвращает bool. Теперь у меня есть несколько заданий, которые были созданы и выполнены. Мне нужно проверить, что все результаты верны.

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

Итак, в этот момент мне нужно продолжить выполнение другого кода, и это должно произойти только в том случае, если все задачи вернулись.

+0

Все это возможно. Если бы вы показали нам свой код и то, что вы пробовали, что не сработало, было бы легче помочь. –

+0

Возможный дубликат [Ограничить количество задач с помощью TPL] (http://stackoverflow.com/questions/16012096/limit-number-of-tasks-with-tpl) Это похоже на ту же проблему. Вместо того, чтобы создавать новые вопросы, пересматривайте текущий. У вас было несколько запросов на специфику. – Paparazzi

+0

Вы хотите синхронно ждать завершения 'Task' или сделать это асинхронно? Кроме того, что должно произойти, если некоторые из «Задачей» терпят неудачу? – 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; 
} 

Обратите внимание, что это не будет обрабатывать исключения в любой из задач, хорошо, вы будете иметь для создания этого. Кроме того, с новой поддержкой async/await в C# 5.0/.NET 4.5 вы можете написать вышеприведенный код, чтобы быть немного более асинхронным, но я останусь один на этот ответ ,

+0

спасибо! Мне нужно все задачи, чтобы выполнить сначала, а затем получить доступ к результатам и продолжить обработку –

Смежные вопросы