您如何评估多个任务的结果

时间:2013-04-15 13:24:37

标签: .net task-parallel-library

使用TPL,我有多个任务设置(动态创建,可能是一个大数字),每个都返回一个bool,我想检查所有任务返回值是否为真。我该怎么办?可能吗?如果没有,是否可以将共享对象传递给每个任务并让任务更新此对象?

编辑:这将是我的任务的一个例子。 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();
        }

所以在这一点上我需要继续执行其他代码,并且只有在所有任务都返回true时才会发生。

1 个答案:

答案 0 :(得分: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中的新async / await支持,您可以编写上面的代码还有一点点非同步友好,但我会单独留下这个答案。