你能简单解释一下为什么这段代码的前两行没有并行运行吗?我怎么能让它起作用呢?
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;
}
答案 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中。