Async attendent vs GetAwaiter().GetResult() et de rappel
Je suis en train d'essayer de trouver la meilleure pratique pour un de mes projet. C'est un cas typique d'application WPF avec une INTERFACE utilisateur qui affiche une liste d'éléments et il y a un service de données qui renvoie le résultat.
Nous appelons le service de manière asynchrone, afin de ne pas bloquer l'INTERFACE utilisateur. Nous avons 2 options en face de nous:
- Asynchrone à l'aide de mots-clés vous attendent
Cela nécessite le marquage de toutes les méthodes Asynchrones de bouton, cliquez sur tous les services de la couche (classe à côté client qui fait l'appel http vers le serveur) et toute méthode entre les deux. Cette approche fonctionne bien pour d'autres la question de la propagation asynchrone partout - Utilisation awaiter et de rappel
Dans cette approche, l'INTERFACE utilisateur du client appelle le service de la couche et passe un rappel à la couche de service, le service de la couche encapsule l'appel http vers le serveur dans une tâche et l'utilisation GetAwaiter().GetResult(), lorsque le http appel est terminé, il appelle le callback passé par l'INTERFACE utilisateur du client. Dans ce cas, aucune méthode a marqué asynchrone, mais pas vraiment sûr de l'utilisation de GetAwaiter()Tâche.Exécuter(async () => //attendre http appel, appeler de rappel).GetAwaiter().GetResult();
Je suis juste essayer de trouver ce qui est une meilleure approche et si il ya des problèmes avec une approche que je devrais être au courant de
Je suis sûr que la deuxième approche peut conduire à la mort des serrures de temps en temps. Je le sais parce que j'ai été confronté à quelque chose de semblable lors du développement avec Windows Universelle.
Il y a aussi la question des exceptions. Je sais qu'avec un plein implémentation asynchrone, vous obtenez le
Quand vous attendent, vous n'obtenez pas une
Il y a aussi la question des exceptions. Je sais qu'avec un plein implémentation asynchrone, vous obtenez le
AggregateException
à la fin, mais je n'ai aucune idée de ce qui se passe à des exceptions dans le GetAwaiter
méthodeQuand vous attendent, vous n'obtenez pas une
AggregateException
. Vous obtenez l'intérieur d'exception. La même chose arrive avec GetResult
.OriginalL'auteur vikas mittal | 2015-12-31
Vous devez vous connecter pour publier un commentaire.
Vous devez utiliser le
async
etawait
mots-clés tout en haut, ou vous ne devriez pas utiliser asynchrone à tous.Votre deuxième option n'est pas vraiment asynchrone. C'est l'appel d'une opération asynchrone et le blocage de manière synchrone avec
task.GetAwaiter().GetResult()
.En plus d'être très compliqué, il n'est pas asynchrone et peut entraîner des blocages.
href="http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html" >blog.stephencleary.com/2012/07/dont-block-on-async-code.html
Cela sonne comme beaucoup de conseils, sauf que je suis coincé avec cette API à partir d'Azure Active Directory (TokenCache), qui exige des opérations synchrones. Vous ne pouvez pas retourner à partir de 'BeforeAccessNotification" jusqu'à ce que vous avez lu le cache et vous ne pouvez pas retourner à partir de 'AfterAccessNotification" jusqu'à ce que vous avez écrit le cache. Quel est votre avis lorsque vous êtes forcé dans un syncrhous API et ont besoin d'accéder à un fichier?
ou vous ne devriez pas utiliser asynchrone à tous".
Bon, alors, comment fait-on appeler une fonction comme FileIO.ReadBufferAsync sans asynchrone?
OriginalL'auteur i3arnon