当第一个异步方法返回true时返回true

Pet*_*ter 6 .net c# asynchronous task-parallel-library

假设我有以下代码

public async Task<bool> PingAddress(string ipAddress)
{
    return await DoSomeThing(10) || await DoSomeThing(11) || await DoSomeThing(12);

}

private async Task<bool> DoSomeThing(int input)
{
    //Do some thing and return true or false.
}
Run Code Online (Sandbox Code Playgroud)

我将如何转换为return await DoSomeThing(10) || await DoSomeThing(11) || await DoSomeThing(12);并行运行并在第一次返回true时返回true,如果所有返回false则返回false!

Ser*_*rvy 9

这是对任务集合的异步"Any"操作.

public static async Task<bool> LogicalAny(this IEnumerable<Task<bool>> tasks)
{
    var remainingTasks = new HashSet<Task<bool>>(tasks);
    while (remainingTasks.Any())
    {
        var next = await Task.WhenAny(remainingTasks);
        if (next.Result)
            return true;
        remainingTasks.Remove(next);
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

  • @Peter这需要合作取消.这些任务都需要给出一个取消令牌,当你完成这个操作的结果时你取消它,这些任务都需要定期检查取消. (2认同)
  • @Peter不,这不适合你.这就是取消合作的原因.这种方法是专门设计用于支持取消,并且特别是定期检查其定义中的取消,或者它没有,并且实际上没有任何东西可以做. (2认同)

Ree*_*sey 5

您可以用来await Task.WhenAny确定任务何时返回,并在第一个任务完成时返回 true。

这通常看起来像:

var tasks = new List<Task<bool>> 
                {
                   DoSomething(10), 
                   DoSomething(11), 
                   DoSomething(12)                        
                };

while (tasks.Any())
{
     var t = await Task.WhenAny(tasks);
     if (t.Result) return true;

     tasks.Remove(t);
}

// If you get here, all the tasks returned false...
Run Code Online (Sandbox Code Playgroud)