【发布时间】:2023-04-09 02:30:01
【问题描述】:
你能简单解释一下为什么这段代码的前两行没有并行运行吗?我怎样才能让它并行工作?
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;
}
【问题讨论】:
-
当您
await第一个任务时,您正在等待它完成,然后再移动到下一行代码。先分配任务,然后使用Task.WhenAll让它们同时运行。 -
async void仅用于事件处理程序。您应该使用async Task。await表示 await 等待异步操作完成。开始并行工作的是Task.Run,而不是await。如果您希望操作并行运行,则将返回的任务存储在一个数组中,并使用await Task.WhenAll(tasks)等待它们完成。 -
此外,除非您调用执行 IO 完成端口的异步方法,否则这不仅速度较慢,而且使用线程可能会导致更多性能问题。
-
请记住,await 不会使某些东西异步。 Await 检查任务是否完成,如果未完成,则返回,以便调用者可以找到更多工作要做。 在这种情况下,方法的其余部分将完成等待的任务。如果您认为 await 使某些事情变得异步,请立即从您的脑海中清除这种不正确的信念。
标签: c# .net properties async-await getter