1

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

编辑:这将是我的任务的一个例子。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 时才会发生这种情况。

4

1 回答 1

2

只需查询每个的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 支持,您可以稍微编写上面的代码对异步也更友好,但我将不理会这个答案。

于 2013-04-15T14:41:11.170 回答