C#async/await - 一个首选的多个任务

Pau*_*rdi 5 c# task-parallel-library async-await

我有以下场景/要求:

我有两个任务,任务A和任务B,它们都返回相同类型的数据.如果任务A在完成时在其结果中包含数据,我需要返回任务A的结果 - 否则我返回任务B的结果.

我正在尝试对并行性进行性能优化,我不确定是否有比我正在做的更好的方法.这似乎是很多代码可以做我想要的.

var firstSuccessfulTask = await Task.WhenAny(taskA, taskB);
if (firstSuccessfulTask != taskA)
{
    await taskA;
}

if (taskA.Result != null)
{
    return taskA.Result;
}

return await taskB;
Run Code Online (Sandbox Code Playgroud)

Ser*_*rvy 12

只需按照您的要求阅读方式编写代码即可.返回A的结果,除非它为null,在这种情况下,返回B的结果

return await taskA ?? await taskB;
Run Code Online (Sandbox Code Playgroud)

  • 在taskA完成之前不会开始执行taskB,有效地使它们串行而不是并行吗? (3认同)
  • @PaulGelardi如果`taskB`实际上是一个在调用该表达式时启动任务的属性,那么是.如果它是具有已启动任务的本地/字段,则为否.鉴于命名约定,以及您反复使用`taskA`的事实(因此每次使用它时显然都不会创建新任务,因为如果您的代码根本不起作用),那么很明显它们都是变量,而不是计算新任务的表达式.如果它们确实是计算新任务的表达式,则需要先将其存储在局部变量中,然后执行此操作. (2认同)