C# async 和 await 关键字无法按预期使用 属性 getter

C# async and await keywords not working as expected with property getter

你能简单解释一下为什么这段代码的前两行不是运行平行的吗?我怎样才能让它并行工作?

SensorLeft和SensorRight是一样的class,Distance是它的public属性,在调用它的get方法时需要一些时间来计算。

我做错了什么?我应该将距离计算作为异步函数而不是正确的吗?

public async void GetDistance()
{
    await Task.Run(() => LeftDistance = SensorLeft.Distance);
    await Task.Run(() => RightDistance = SensorRight.Distance);
    Distance = RightDistance < LeftDistance ? RightDistance:LeftDistance;
}

当编译器遇到await关键字时,它会自动在任务调度器中调度一个任务。该操作等待(以非阻塞方式)任务完成,然后继续执行代码块的其余部分。

要使您的代码 运行 并行,您需要将其修改为

public async Task GetDistance()
{
    var leftDTask = Task.Run(() => LeftDistance = SensorLeft.Distance);
    var rightDTask= Task.Run(() => RightDistance = SensorRight.Distance);
    await Task.WhenAll(leftDTask,rightDTask);
    Distance = RightDistance < LeftDistance ? RightDistance:LeftDistance;
}

Task.WhenAll 重载到 return Task<TResult[]> Task.WhenAll<TResult[]>。您可以将代码替换为

public async Task GetDistance()
{
    var leftDTask = Task.Run(() => SensorLeft.Distance);
    var rightDTask= Task.Run(() => SensorRight.Distance);
    var results= await Task.WhenAll(leftDTask,rightDTask);
    Distance = Math.Min(results[0],results[1]);
}

但是,这不是一个好的解决方案。如果你想要真正异步的获取距离,你应该制作一个异步获取方法而不是将其包装到 Task.Run 中。