without - create async task c#




Quand devrais-je attendre mes async? (2)

D'après ce que je comprends: parce que les méthodes utilisées dans les services de meubles et d'appareils électroménagers décrits ci-dessus nécessitent House, elles attendent que House soit disponible avant de continuer.

Votre compréhension est fausse. Les méthodes qui nécessitent House, elles n’attendent pas que vous obteniez House parce que vous en avez besoin. Ils ne résolvent pas leurs dépendances et quand attendre pour le code ou pas par eux-mêmes. Le code attend pour obtenir des maisons parce que vous avez await avant . Il n'est pas au courant de ce qui va se passer ensuite.

Ensuite, les deux méthodes nécessitant House seront exécutées, mais la deuxième méthode (GetAppliancesForHouse) n'attendra pas la fin de la première avant de commencer.

De même, GetAppliancesForHouse ne comprendra pas s'il doit attendre ou non en fonction des dépendances. GetAppliancesForHouse ne s'exécutera pas, car votre code indique d'attendre avant GetFurnitureForHouse . Votre code sera toujours exécuté de manière séquentielle .

La compréhension de Jim est la suivante: nous devrions attendre les deux méthodes uniquement lorsqu'elles sont nécessaires. Pour qu'ils soient tous les deux parallèles.

C'est généralement vrai. Comme d'autres l'ont souligné, le code pourrait toujours ne pas être exécuté en parallèle, en fonction d'autres facteurs. En outre, il peut y avoir des raisons légitimes de ne pas vouloir exécuter du code en parallèle.

Il pense que si je le fais à ma manière, la deuxième méthode attendra la première, à savoir: GetAppliancesForHouse en attente de GetFurnitureForHouse.

Il a raison.

Pour voir ce qui se passe exactement, vous pouvez mettre des points d'arrêt et voir ce qui se passe après chaque ligne. Dans le cas Jims, après avoir passé de Furniture à Appliances, la variable furniture n’a pas encore de valeur, c’est toujours une tâche, mais vous êtes déjà dans la ligne suivante.

Avec votre cas, allez à la ligne Appareils, vous verrez que Meubles a déjà la valeur, car il l’attendait.

Nous sommes actuellement en train de refactoriser des sections de notre projet pour qu'elles soient asynchrones, yay!

En raison de notre compréhension différente, moi et un collègue (appelons-le Jim), avons des opinions divergentes sur la façon dont notre code async / wait sera exécuté et sur le moyen de l'écrire.

Voici l'exemple de méthode écrit par 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);
}

Et l'exemple de comment je l'écrirais:

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

D'après ce que je comprends: parce que les méthodes utilisées dans les services de furniture et d' appliance décrits ci-dessus nécessitent House , elles attendent que House soit disponible avant de continuer. Ensuite, les deux méthodes nécessitant House seront exécutées, mais la deuxième méthode ( GetAppliancesForHouse ) n'attendra pas la fin de la première avant de commencer.

La compréhension de Jim est la suivante: nous devrions attendre les deux méthodes uniquement lorsqu'elles sont nécessaires. Pour qu'ils soient tous les deux parallèles. Il pense que si je le fais à ma manière, la deuxième méthode attendra la première, à savoir: GetAppliancesForHouse attente de GetFurnitureForHouse .

Est-ce que certaines de ces compréhensions sont correctes? Ou avons-nous simplement inventé au fur et à mesure? Quand devrions-nous attendre?


Aucun de vous n'est correct, voir la réponse de Erndob pour les raisons. Cependant, l'une des questions n'a pas de réponse:

Quand devrions-nous attendre?

  • Voulez-vous que le travail soit effectué de manière séquentielle? Utilisez votre chemin.
  • Voulez-vous que le travail soit effectué en parallèle? Utilisez le chemin de Jim.

Remarque : le chemin de Jim ne fonctionnera pas en parallèle si le planificateur de tâches utilisé ne peut pas exécuter les deux tâches en même temps, par exemple, en raison d'un manque de ressources système (merci @AdamSimon ).





async-await