En attente de plusieurs tâches avec différents résultats
j'ai 3 Tâches:
Tous doivent être lancés avant que mon code ne puisse continuer à fonctionner et j'ai également besoin de résultats de chacun d'eux. Aucun des résultats n'a rien de commun avec l'autre.
Comment puis-je appeler et attendre l'achèvement de 3 tâches, puis obtenir les résultats?
</tesla></house></cat>
private async Task<cat> FeedCat// {}
private async Task<house> SellHouse// {}
private async Task<tesla> BuyCar// {}
Tous doivent être lancés avant que mon code ne puisse continuer à fonctionner et j'ai également besoin de résultats de chacun d'eux. Aucun des résultats n'a rien de commun avec l'autre.
Comment puis-je appeler et attendre l'achèvement de 3 tâches, puis obtenir les résultats?
</tesla></house></cat>
Aucun résultat connexe trouvé
Invité:
Pour répondre aux questions, connectez-vous ou registre
10 réponses
Ernest
Confirmation de:
, Vous pouvez extraire les résultats individuellement avec
:
Vous pouvez aussi utiliser
/Depuis ce moment, vous savez qu'ils sont tous terminés avec succès/. Cependant, je recommande d'utiliser
, Parce que c'est clairement correct, alors que
Peut causer des problèmes dans d'autres scénarios.
Gilles
Confirmation de:
Trois tâches individuellement, après les avoir annoncées.
Agathe
Confirmation de:
... Pour activer une syntaxe pratique similaire à celle-ci lorsque vous souhaitez attendre plusieurs tâches avec différents types de données retournées. Bien sûr, vous devrez faire quelques surcharges pour un nombre différent de tâches qui attendront.
Cependant, si vous voulez transformer cet exemple en quelque chose de réel, reportez-vous à la marque de réponse de Grace pour certaines optimisations autour de ValueTask et des tâches déjà terminées.
</t2></t1></t1,>
Edouard
Confirmation de:
,
et
, Il y a deux cas intéressants: soit tout ce qu'ils sont exécutés de manière synchrone /Pour une raison quelconque, peut-être la mise en cache ou une erreur/, Ou non.
Supposons que nous ayons, sur la base de la question:
Maintenant, ce serait une approche simple:
mais ... Ce n'est pas pratique pour le traitement des résultats; Habituellement nous voulons
Ce:
Mais il fait de nombreux coûts généraux et met en évidence diverses tableaux /Y compris un tableau
params Task[]
/ et listes /intérieurement/. Ça marche, mais pas très bon IMO. À bien des égards
plus simple
Opération d'utilisation
et juste
À son tour:
Contrairement à certains commentaires ci-dessus, utilisez
au lieu
n'a pas
aucune valeur
Pour comment les tâches sont effectuées /En même temps, séquentiellement, etc./. Au plus haut niveau
précédé
Bon soutien du compilateur pour
/
et était utile
Quand ces choses n'existaient pas
. Il est également utile lorsque vous avez un tableau de tâches arbitraire et non 3 Tâches discrètes.
Mais: nous avons encore un problème que
/
Génère beaucoup de bruit de compilateur à continuer. S'il y a une chance que les tâches soient vraiment
peut être
Terminé de manière synchrone, nous pouvons l'optimiser en construisant un chemin synchrone avec une option de sauvegarde asynchrone:
Cette approche "sync path with async fallback" Il devient de plus en plus courant, en particulier dans le code hautes performances où l'achèvement synchrone par rapport à fréquent. Veuillez noter que cela ne vous aidera pas du tout si l'achèvement sera toujours vraiment asynchrone.
Des choses supplémentaires utilisées ici:
Avec récent C#, Modèle général pour
La méthode de sauvegarde est généralement mise en œuvre comme fonction locale:
Préférer
, S'il y a de fortes chances que les choses soient tout à fait de manière synchronique avec de nombreuses valeurs de retour différentes:
Si possible, préférence
; Il existe maintenant dans le noyau .NET pour
Et partout pour
</t></string></tesla></house></cat></tesla></house></cat></string></string></t></t></tesla></house></cat></tesla></house></cat></string></string></tesla></house></cat></tesla></house></cat></string></tesla></house></cat></string></tesla></house></cat></string></tesla></house></cat></string>
Conrad
Confirmation de:
Dominique
Confirmation de:
Imagine ça FeedCat Provoque une exception dans le code suivant:
Dans ce cas, vous n'attendrez jamais houseTask, non plus carTask. Il y a ici 3 Scénarios possibles:
SellHouse déjà terminé avec succès quand FeedCat manqué. DANS
Avec ce cas, vous allez bien.
SellHouse Il n'est pas complet et à un moment donné échoue à l'exception. L'exception n'est pas observée et sera repensée en finale de la finale.
SellHouse Ce n'est pas complet et contient à l'intérieur de l'attente. Lorsque
, Si votre code fonctionne dans ASP.NET SellHouse, échouera, dès que certains des
Les attentes seront complétées à l'intérieur. C'est parce que tu es surtout
Forcé fire & oublier le défi et le contexte de synchronisation a été perdu dès que possible FeedCat manqué.
Voici l'erreur que vous obtenez pour le cas /3/:
Pour le cas /2/ Vous recevrez une erreur similaire, mais avec la pile d'exception d'origine trace.
Pour .NET 4.0 et des versions ultérieures, vous pouvez intercepter des exceptions inobservables avec TaskScheduler.UnobservedTaskException. Pour .NET 4.5 et plus tard, des exceptions non observées par défaut sont avalées pour .NET 4.0 L'exception inobservable conduira à l'échec de votre processus.
En savoir plus ici:
https://blogs.msdn.microsoft.c ... -4-5/
Darius
Confirmation de:
, Comme mentionné, ou
, Selon si vous voulez que le flux attendit. Jetez un coup d'œil au lien pour expliquer l'autre.
https://coderoad.ru/6123406/
Gregoire
Confirmation de:
, Puis attendez les résultats:
Emile
Confirmation de:
Juste une chamap rapide pour ceux qui visitent cela et d'autres ruisseaux similaires, à la recherche d'une manière
Parallélate EntityFramework Utilisation d'un ensemble d'outils async+await+task:
Le modèle indiqué ici semble sain, cependant, lorsqu'il s'agit d'un flocons de neige spécial EF, Vous n'abandonnerez pas d'exécution parallèle avant d'utiliser séparément /Nouveau/ db-context-instance À l'intérieur de chaque appel impliqué *Async//.
Ce genre de choses est nécessaire en raison des restrictions de conception inhérentes. ef-db-contexts, qui interdisent l'exécution de plusieurs demandes en parallèle dans une seule instance ef-db-context.
En utilisant les réponses déjà données, c'est un moyen de vous assurer que vous avez collecté toutes les valeurs, même si une ou plusieurs tâches seront dépassées:
Une mise en œuvre alternative qui a peut-être des caractéristiques de performance plus ou moins identiques:
</string></tesla></house></cat></string></string>
Francois
Confirmation de:
Si vous voulez accéder Cat, Tu le fais:
var ct = /Cat/dn[0];
Il est très facile de faire et est très utile à utiliser, il n'est pas nécessaire d'aller chercher une solution difficile.
</dynamic>