Comment ne attendent async en C#
Je suis en train d'essayer de comprendre comment vous attendent async en C# et une chose est source de confusion pour moi. Je comprends que toute méthode qui utilise le mot clé await doit être marqué avec async.
Ma compréhension est que, lorsqu'une ligne avec le mot clé await est frappé le code ci-dessous que la ligne n'est pas exécutée. Une opération asynchrone est de commencer à exercer sur l'état de l'attendre et de la ligne de contrôle est renvoyé à l'appelant la méthode qui peut procéder à l'exécution.
La Question n ° 1: cette hypothèse Est correcte ou le code ci-dessous le mot clé await est toujours exécuté?
Deuxièmement, supposons que j'ai appelé un service méthode async et la nécessité de retourner son résultat. L'instruction return est ci-dessous le mot clé await.
Question # 2: Quand est-ce que l'instruction return succès, après l'appel asynchrone est terminée ou avant?
La Question n ° 3: je veux utiliser le résultat de l'appel de service et d'opération asynchrone l'habitude de l'aider parce que je veux la méthode d'appel à être touché lorsque le résultat a été retourné. Je comprends que cela peut être fait en utilisant le Résultat de la propriété qui fait l'appel synchronus. Mais alors qu'est-ce que l'utilisation de async en DB opérations de cause, ils sont ceux qui prennent 80% du temps dans la plupart des applications.
La Question n ° 4: Comment puis-je utiliser asynchrone avec DB opérations? Est-il possible et recommandé?
La Question n ° 5: En ce qui scenraio va opérations asynchrones être utile, il semble que chaque api est juste faire des opérations asynchrones maintenant sans raison? ou ai-je raté le point de l'utilisation asynchrone ops?
Ce que je veux dire en disant que l'api font asyn méthodes sans raison est parce que les méthodes ont pour retourner quelque chose et jusqu'à ce que le calcul est fait comment peuvent-ils de retour donc dans essense de ne pas l'appeler encore de blocage dans le sens où il sera inutile jusqu'à ce que le résultat est retourné?
- Vous vous posez beaucoup de questions. AINSI fonctionne le mieux si vous demandez à un unique et ciblé question. Si vous avez plus d'une question, postez-les séparément.
- la façon dont je le vois MDSN me confond encore plus et a laissé beaucoup de questions dans mon esprit. Si quelqu'un d'autre a le même problème, peut-être qu'ils peuvent voir ce fil et de comprendre async ops mieux. Toutes mes questions sont liées à un sujet qui, pour moi, il ne serait pas judicieux de mettre 5 différentes questions et j'espère que quelqu'un va les voir toutes...
- DONC, est sur le partage de votre connaissance? La seule règle est que les questions doivent être précises et responsable.
- Le problème avec l'affichage de multiples questions, c'est que une personne pourrait répondre à certaines de vos questions et de l'autre l'un de l'autre partie de vos questions. Dans ce cas, comment jugez-vous la réponse devrait être acceptée?
- Aussi pertinentes - stackoverflow.com/questions/37419572/... et stackoverflow.com/questions/42287737/...
Vous devez vous connecter pour publier un commentaire.
MSDN explique tout.
Je comprends que parfois, la vanille docs (en particulier à partir de MSDN) peut être difficile à appliquer à votre situation particulière, alors allons-y plus de vos points.
Le code ci-dessous la "attendent" mot-clé ne sera exécuté que lorsque l'appel asynchrone est terminée. Dans l'intervalle, depuis votre méthode est marqué "async", le contrôle sera renvoyé à l'appelant de votre méthode jusqu'à ce que votre méthode est terminée.
À partir de MSDN lien ci-dessus:
Je pense que les commentaires sont assez explicites.
Deuxièmement, supposons que j'ai appelé un service méthode async et la nécessité de retourner son résultat. L'instruction return est ci-dessous le mot clé await.
Après.
Supposons que vous avez besoin de faire trois sans rapport avec les requêtes DB pour compléter votre service, puis effectuer un calcul sur la base des résultats, puis sur terminer. Si vous l'avez fait de manière séquentielle, vous aurez à attendre jusqu'à ce que chaque opération est terminée. Si vous utilisez les appels asynchrones, alors C# sera exécuté les trois requêtes en parallèle et de votre service pourrait s'achever plus tôt.
En outre, les opérations que le retour de la Tâche peut être utilisé comme Terme. Voir MSDN sur les contrats à Terme où plusieurs modèles sont discutés sur la façon de paralléliser le travail basé sur des contrats à terme et de fusionner les résultats.
Si votre service ne nécessite qu'un DB appel, puis il va certainement être pire pour vous appeler async.
ADO.NET comprend maintenant des méthodes asynchrones ReadAsync et NextResultAsync .
Il est certainement possible, que les recommandations de cette discussion est beaucoup plus complet que j'ai pu écrire ici.
opérations asynchrones sont très utiles facilement pour paralléliser aucune longues opérations sans se heurter à des problèmes de threading. Si votre méthode ne fait qu'une seule chose, ou une séquence simple (rapide) des choses, alors oui il est inutile d'aller asynchrone. Toutefois, si vous avez plus d'un long cours d'exécution des opérations, il est beaucoup plus facile et moins sujette aux erreurs de paralléliser via async que c'est pour faire la gestion des threads.
La plupart de vos questions sont répondues dans le officiel la documentation et aussi dans une intro post que j'ai écrit.
Entity Framework 6 (actuellement en Bêta) prend en charge
async
. Bas-niveau de l'Api de base de données de soutien des opérations asynchrones d'une manière ou d'une autre. Certains d'entre eux (par exemple, SQLite) soutienasync
directement; d'autres ont besoin de vous pour écrire de simplesasync
-compatible wrappers.Oui, à moins que vous écrivez un serveur frontal (par exemple, ASP.NET) qui parle à un non-évolutive unique de la base de données de la machine sur l'arrière. Dans ce cas précis, il n'y a aucun point dans votre prise avant la fin de l'échelle parce que votre back-end ne peut évoluer pour le match de toute façon.
Les avantages d'opérations asynchrones sont: