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 中。
你能简单解释一下为什么这段代码的前两行不是运行平行的吗?我怎样才能让它并行工作?
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 中。