如何根据条件等待任务?

dav*_*d.s 3 c# asynchronous async-await

我想知道返回的至少一个结果是否GetDataFromLongRunningOp满足特定条件:

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

return false;
Run Code Online (Sandbox Code Playgroud)

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

编辑GetDataFromLongRunningOp是一种异步方法。

dav*_*d.s 5

GetDataFromLongRunningOp使用异步运行Task.Run。使用 a 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;
Run Code Online (Sandbox Code Playgroud)