如何根据条件等待任务?

时间:2014-08-05 15:40:57

标签: c# asynchronous async-await

我想知道GetDataFromLongRunningOp返回的结果中是否至少有一个符合某个条件:

foreach (var item in list)
{
    var result = GetDataFromLongRunningOp(item);
    if (CheckCondition(result))
    {
        return true;
    }
}

return false;

如何为每个项目并行调用GetDataFromLongRunningOp,以减少找到答案所需的总时间?

修改GetDataFromLongRunningOp是一种异步方法。

2 个答案:

答案 0 :(得分:2)

使用GetDataFromLongRunningOp异步运行Task.Run。使用TaskCompletionSource,当返回满足条件的结果时,将返回已完成的任务。如果没有结果符合条件,那么tcs.Task将永远不会完成。您需要另一个等待完成所有任务的任务。因此,最后,您需要等待tcs.TaskTask.WhenAll完成。

var result = false;

var tasks = new List<Task>();
var tcs = new TaskCompletionSource<bool>();

foreach (var item in list)
{
    var task = Task.Run(() => GetDataFromLongRunningOp(item))
        .ContinueWith(t =>
        {
            if (CheckCondition(t.Result))
            {
                result = true;
                tcs.TrySetResult(true);
            }
        });
    tasks.Add(task);
}

await Task.WhenAny(tcs.Task, Task.WhenAll(tasks));

return result;

答案 1 :(得分:1)

假设您的工作是CPU绑定而非IO绑定,您可以查看Parallel.ForEach

Parallel.ForEach(list, (item) => 
{
    var result = GetDataFromLongRunningOp(item);
    if (CheckCondition(result))
    {
        return true;
    }
});

return false;

请注意,您必须确保GetDataFromLongRunningOp是线程安全的,当然,基准您的代码,以确保并行运行并不会超过成本。< / p>