La compréhension de l'utilisation de la Tâche.Run + Wait() + async + attendent utilisé dans une ligne
Je suis un C# débutant, donc j'ai du mal à comprendre certains concepts, et je tombe sur un morceau de code que je ne suis pas tout à fait comprendre:
static void Main(string[] args)
{
Task.Run(async () => { await SomeClass.Initiate(new Configuration()); }).Wait();
while (true) ;
}
Que je comprends, il exécute une tâche qui initie une méthode. Cette méthode s'exécute, puis, une fois terminée, il entre dans une boucle infinie d'attente. Il estime que le code ne fait pas de sens, ou que je ne suis pas la compréhension de droit.
Grâce
Il est de forcer une méthode asynchrone
Il y a de mieux des morceaux de code "exécuter en" pour l'exécution de méthodes asynchrones en application de console - stackoverflow.com/questions/17630506/async-at-console-app-in-c
SomeClass.Initiate
être exécutée de manière synchrone. De La Tâche.Exécuter emballage de la méthode asynchrone n'est pas nécessaire. La boucle infinie est d'empêcher la fenêtre de la console de clôture immédiatement après la fin de Initiate
. D'où ce code de viennent de, est là n'importe quel contexte?Il y a de mieux des morceaux de code "exécuter en" pour l'exécution de méthodes asynchrones en application de console - stackoverflow.com/questions/17630506/async-at-console-app-in-c
OriginalL'auteur Pdon | 2016-09-21
Vous devez vous connecter pour publier un commentaire.
Vous pouvez annuler cet écart, dans plusieurs parties:
Est une expression lambda qui définit une
async
méthode qui attend juste une autre méthode. Cette lambda est ensuite transmis àTask.Run
:Task.Run
exécute son code sur un thread du pool. Alors, queasync
lambda sera exécuté sur un thread du pool.Task.Run
renvoie uneTask
qui représente l'exécution de laasync
lambda. Après l'appel deTask.Run
, le code appelleTask.Wait
:Cela va bloquer la console principale application jusqu'à ce que le lambda asynchrone est complètement terminé.
Si vous voulez voir comment elle est cassée, le suivant est à peu près équivalent:
while(true)
à la fin?C'est dans le cas des op code original.
quelle est la raison pour quelqu'un d'écrire un code comme celui-ci? Est-il équivalent à
SomeClass.Initiate(new Configuration()).Result
?Le code d'origine est de tenter de faire de la synchronisation-sur-async. Quand la synchro-sur-asynchrone utilisé pour être commun dans une application console
Main
méthode, ces joursMain
peut êtreasync
, donc il n'est plus nécessaire.OriginalL'auteur Stephen Cleary
J'ai écrit un petit .NET Violon que le simple ajout de quelques
Console.WriteLine
appels pour, je l'espère, de vous montrer que l'ordre d'exécution.La
Tâche.Run
renvoie uneTask
qui représente une opération asynchrone, (une méthode qui s'exécute de façon asynchrone). C'est le paramètre de cette situation est l'Func<Task>
. Votre code a utilisé laasync
etawait
mots-clés, de ce fait, votre appel àSomeClass.Initiate
est une lambda asynchrone.Tous async code doit retourner un awaitable, sauf dans les rares cas où vous êtes à la création d'un gestionnaire d'événement qui doit lancer quelques appels asynchrones.
La
Task
est retourné à partir de l'invocation deTask.Run
est immédiatement invoquant.Wait()
.Cet appel à
Task.Run
n'est pas nécessaire, vous pouvez simplement appeler.Wait()
sur leTask
est retourné à partir de laSomeClass.Initiate
méthode.Comme pour la boucle infinie, une application de console se ferme immédiatement-on pourrait tout simplement faire la
Console.ReadLine
et d'attendre que l'utilisateur d'appuyer sur le Entrée clé par exemple.OriginalL'auteur David Pine
Plus susceptibles
SomeClass.Initiate
est synchrone méthode marquéasync
pour aucune raison. Que quelqu'un a essayé de faire vraiment exécuter de manière asynchrone et ajoutéTask.Run
pour l'exécuter sur un thread séparé. Mais puisque c'est la console de l'application - ajout d'.Wait()
attendre la fin de l'opération.Et
while (true) ;
est là parce que lors de l'exécution de VS console application se ferme sans laisser de trace quand c'est fait, plus de façon évidente - ajouterConsole.ReadLine()
appel.while(true)
n'est pas liée à async partie à tous que le code ne sera pas le laisser.Wait()
appel avant l'opération est faite.Une autre possibilité est l'auteur était d'expérimenter avec
async
et n'ont pas.Wait()
ou.Result
- ainsiwhile(true)
donnerait une chance pour l'opération de finition.Voir async à l'application console en C#? de manière appropriée à l'exécution asynchrone de code dans l'application console (juste
.Wait()
ou.Result
)OriginalL'auteur Alexei Levenkov