J'essaie de ne pas créer de tâche code> redondante code> dans mon code et j'écris Lorsqu'il est nécessaire de sauvegarder la valeur renvoyée par une fonction code> async code>, je suis obligé de rendre la fonction renvoyer la fonction example:pre ,xxxxp>Que j'ai écrit à la place: p> mais je J'ai peur de bloquer le fil d'appel comme un code synchrone. p> Task code> Fonctions de retour au lieu de
Async Task Code> Fonctions où il est possible. .
async tâche code> et appelle fonction avec
attendre .
await SomeWorkAsync(); //main thread block
3 Réponses :
Si vous souhaitez enregistrer votre auto, appelez simplement
public async Task SomeWorkAsync() { someGlobalVariable = await AnotherWorkAsync(); }
Oui, cela fait l'affaire si un autre utworkasync code> est
async tâche code> mais dans mon cas c'est
async tâche
Un autre ukworkasync code>
Ce n'est toujours pas ce que je veux dire. Classe qui appellera CertainworkAsync code> ne sait rien de la variable privée
individuelglobalvariable code>. Il est nécessaire d'obtenir de la valeur et de définir cette variable à l'intérieur
Eh bien, maintenant c'est la même chose que j'écris dans l'exemple :) Il semble qu'il n'y ait pas d'autre moyen
@ Денисперевозчиков Il semble impossible ce que vous demandez. Si vous voulez ne pas bloquer le fil, il n'y a pas d'autre moyen que d'utiliser attendre code> mot-clé. Toutes les autres options bloqueraient le fil et le code d'exécution synchrone
J'essaie de ne pas créer d'objets de tâches redondants dans mon code et j'écris des fonctions de retour de tâche au lieu des fonctions de tâche asynchronisées où elle est possible. P>
Ce n'est pas courant ni la façon prévue de travailler avec le TPL. p>
c'est faux: p>
xxx pré> Vous devez utiliser p>
xxx pré> uniquement dans des circonstances strictes devrait Vous utilisez
.result code> pour obtenir le résultat d'une tâche
code>. p> blockquote>
Merci d'avoir chiming dans, je dois aller me coucher et votre explication est bien meilleure
@Thegeneral Sans problème, bon sommeil :)
Vous ne devriez jamais utiliser .result. Au lieu de cela, vous devriez utiliser .getawaiter (). GetResult (). Il n'y a aucune circonstance où vous pouvez utiliser .result et ne peut pas utiliser .GETAWAITER (). GETRESULT ()
@Olegi Si vous envisagez l'avertissement de ne pas utiliser .getawaiter () code> dans le résumé de la fonction, car cela est censé être utilisé à l'intérieur par le compilateur, vous devez préférer utiliser
.result Code>
@Camiloterevinto N ° N ° .Result va envelopper toutes vos exceptions en agrégateException, à l'exception de celle-ci, elle se comporte absolument identique à celle de .getawaiter (). GetResult (). Il n'y a aucun cas d'usage dans lequel vous devez utiliser .result
J'ai lu dans certains articles qu'il est mauvais pratique d'ajouter async code> uniquement pour un appel avec
attendre code> car il crée une nouvelle tâche et charges gc
@ Денисперевозчиков et Stephen Cleary, l'un des principaux développeurs, dit de ne pas s'inquiéter de l'extrême petite surcharge ajoutée. Veuillez prendre le temps de lire: blog.stephancleary.com/2016/12 /elling-async-await.html Il y a trop de BS sur le TPL. Il y a des cas où async / attendre peut être évité, mais pas dans l'affaire dans votre question
@ Денисперевозчиков Vous avez mal compris async code> mot-clé. Cela ne fait que donner la possibilité d'appeler une méthode en attente avec
attendre code> mot-clé
@Onegi c'est complètement faux. En utilisant attendre code> ajoute une machine d'état dans le code généré. Que, bien que petit, ajoute des frais généraux
Pour répondre à votre question: P>
.result code> bloquera votre fil. Li>
- Voir mon commentaire sur pourquoi je pense qu'il est préférable d'utiliser attendre et de ne pas renverser une tâche: https://stackoverflow.com/ A / 54211382/918058 LI>
ol>
Tâche.Result bloque le fil d'appel: docs.microsoft.com/en-us/dotnet/api/...