C#async并等待关键字与property getter无法正常工作

时间:2018-01-25 17:39:56

标签: c# .net properties async-await getter

你能简单解释一下为什么这段代码的前两行没有并行运行吗?我怎么能让它起作用呢?

SensorLeft和SensorRight属于同一类,Distance是它的公共属性,在调用get方法时需要一些时间来计算。

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

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

1 个答案:

答案 0 :(得分:-1)

当编译器遇到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有一个重载来返回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]);
}

然而,这不是一个好的解决方案。如果您希望获取距离真正异步,则应该创建一个异步get方法,而不是将其包装到Task.Run中。