我们目前正在重构项目的各个部分,以便上下同步,是的!
由于我们的理解不同,我和一位同事(我们叫他吉姆)对我们的异步/等待代码将如何执行以及编写方式有不同的看法。
这是Jim编写的示例方法:
public async Task<HouseModel> GetHouseModel(Guid houseId)
{
House house = await _houseService.GetHouse(houseId);
Task<IEnumerable<Furniture>> furniture = _furnitureService.GetFurnitureForHouse(house);
Task<IEnumerable<Appliances>> appliances = _applianceService.GetAppliancesForHouse(house);
return _houseModelFactory.MakeHouseModel(await furniture, await appliances);
}
以及我将如何编写的示例:
public async Task<HouseModel> GetHouseModel(Guid houseId)
{
House house = await _houseService.GetHouse(houseId);
IEnumerable<Furniture> furniture = await _furnitureService.GetFurnitureForHouse(house);
IEnumerable<Appliances> appliances = await _applianceService.GetAppliancesForHouse(house);
return _houseModelFactory.MakeHouseModel(furniture, appliances);
}
我的理解是:由于上述furniture
和appliance
服务中的方法都需要House
,它们将等待House
可用,然后再继续。然后,需要的两个方法都House
将运行,但是第二个方法(GetAppliancesForHouse
)在启动之前不会等待第一个方法完成。
Jim的理解是:只有在需要这两种方法时,我们才应该等待它们。这样它们将彼此平行运行。他认为以我的方式进行操作会导致第二种方法等待第一种方法,即:GetAppliancesForHouse
等待GetFurnitureForHouse
。
这些理解中是否正确?还是我们一直在进行弥补?我们什么时候应该等待?
我的理解是:由于上述家具和家电服务中的方法都需要House,因此他们将等待House可用后再继续。
您的理解是错误的。需要众议院的方法,他们不是在等待您获得众议院,因为您需要它。他们不解决自己的依赖关系以及何时独自等待代码。代码等待得到房子,因为你await
之前。它不知道接下来会发生什么。
然后,需要House的两个方法都将运行,但是第二个方法(GetAppliancesForHouse)将不等待第一个方法完成后再启动。
同样,GetAppliancesForHouse
基于依赖关系,是否应该等待也不会有自己的理解。GetAppliancesForHouse
不会运行,因为您的代码说先等待GetFurnitureForHouse
。您的代码将始终按顺序运行。
Jim的理解是:只有在需要这两种方法时,我们才应该等待它们。这样它们将彼此平行运行。
通常是这样。正如其他人指出的那样,取决于其他因素,代码可能仍不能并行运行。同样,出于正当的理由,我们不想并行运行代码。
他认为以我的方式进行操作将导致第二种方法等待第一种方法,即:GetAppliancesForHouse等待GetFurnitureForHouse。
他是对的。
要查看确切发生了什么,您可以放置断点并查看每行之后发生的情况。在Jims的情况下,从Furniture到Appliances之后,Furniture变量还没有值,这仍然是一项任务,但是您已经在下一行中。
对于您的案例,转到“设备”行,您将看到家具已经具有该值,因为它已经在等待它。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句