使用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时才会发生。
答案 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支持,您可以编写上面的代码还有一点点非同步友好,但我会单独留下这个答案。