我什么时候应该等待异步?

杰克·彼得丁格:

我们目前正在重构项目的各个部分,以便上下同步,是的!

由于我们的理解不同,我和一位同事(我们叫他吉姆)对我们的异步/等待代码将如何执行以及编写方式有不同的看法。

这是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);
}

我的理解是:由于上述furnitureappliance服务中的方法都需要House,它们将等待House可用,然后再继续。然后,需要的两个方法都House将运行,但是第二个方法(GetAppliancesForHouse)在启动之前不会等待第一个方法完成。

Jim的理解是:只有在需要这两种方法时,我们才应该等待它们。这样它们将彼此平行运行。他认为以我的方式进行操作会导致第二种方法等待第一种方法,即:GetAppliancesForHouse等待GetFurnitureForHouse

这些理解中是否正确?还是我们一直在进行弥补?我们什么时候应该等待?

Erndob:

我的理解是:由于上述家具和家电服务中的方法都需要House,因此他们将等待House可用后再继续。

您的理解是错误的。需要众议院的方法,他们不是在等待您获得众议院,因为您需要它。他们不解决自己的依赖关系以及何时独自等待代码。代码等待得到房子,因为你await之前它不知道接下来会发生什么。

然后,需要House的两个方法都将运行,但是第二个方法(GetAppliancesForHouse)将不等待第一个方法完成后再启动。

同样,GetAppliancesForHouse基于依赖关系,是否应该等待也不会有自己的理解。GetAppliancesForHouse不会运行,因为您的代码说先等待GetFurnitureForHouse您的代码将始终按顺序运行

Jim的理解是:只有在需要这两种方法时,我们才应该等待它们。这样它们将彼此平行运行。

通常是这样。正如其他人指出的那样,取决于其他因素,代码可能仍不能并行运行。同样,出于正当的理由,我们不想并行运行代码。

他认为以我的方式进行操作将导致第二种方法等待第一种方法,即:GetAppliancesForHouse等待GetFurnitureForHouse。

他是对的。

要查看确切发生了什么,您可以放置​​断点并查看每行之后发生的情况。在Jims的情况下,从Furniture到Appliances之后,Furniture变量还没有值,这仍然是一项任务,但是您已经在下一行中。

对于您的案例,转到“设备”行,您将看到家具已经具有该值,因为它已经在等待它。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

您什么时候应该等待任务?

为什么我的异步Jest测试应该在什么时候不失败?

我什么时候应该使用GROUP BY?

我什么时候应该使用blockingGet?

我什么时候应该使用SynchronousQueue

我什么时候应该抛出`ObjectDisposedException`?

我什么时候应该使用`sparse`?

我什么时候应该使用FutureBuilder?

我什么时候应该使用.copy()

我应该什么时候使用 JSDocs?

我什么时候应该销毁令牌

异步/等待-什么时候返回Task vs void?

节点js什么时候应该使用异步机制

我什么时候应该使用sed和什么时候应该使用awk

我什么时候应该使用 async/await,什么时候应该使用回调 [js]?

我什么时候应该处理异常,什么时候应该抛出它们?

在为Fable编写F#时,什么时候应该使用异步,什么时候应该使用promise?

我什么时候应该宣布“投掷”,什么时候不宣布?

我到底应该什么时候打电话给[super viewWillAppear:],什么时候不打电话?

我什么时候应该var_export(...,TRUE),什么时候假?

我什么时候应该引用CMake变量?

困惑我什么时候应该分配malloc

我什么时候应该写{}包围导入的东西?

我们什么时候应该使用@Component在春天?

我什么时候应该使用PostgreSQL Index Include?

我什么时候应该用颤集团模式?

我什么时候应该调用glDeleteBuffers()?

我什么时候应该调用realm.close()?

我什么时候不应该取消-9进程?