Programmation asynchrone dans les applications de console: un guide pratique
L'exécution du code asynchrone dans la méthode Main
d'une application de console nécessite une attention particulière en raison des limites de la méthode Main
elle-même. Cet article explore des stratégies efficaces pour réaliser une exécution asynchrone.
Avant Visual Studio 2017 Update 3 (15.3), les méthodes asynchrones Main
n'étaient pas prises en charge. Cependant, C # moderne permet une méthode asynchrone Main
Retour Task
ou Task<T>
.
<code class="language-csharp">class Program { static async Task Main(string[] args) { // Asynchronous operations here... } }</code>
Bien que apparemment simple, cette approche peut se comporter de la même manière que GetAwaiter().GetResult()
, bloquant potentiellement le fil principal. Le comportement précis reste nuancé, compte tenu des raffinements en cours de spécification du langage C #.
La fonctionnalité de l'opérateur await
est la clé: lors de la rencontre d'un attente incomplet, il permet à la méthode async
de revenir immédiatement, en reprenant l'exécution une fois l'attente terminée. Surtout, await
capture le contexte actuel de cette reprise.
Dans les applications de console, cela présente un défi. La terminaison du programme des signaux de retour Main
de la méthode au système d'exploitation.
Pour surmonter cela, nous pouvons utiliser un contexte personnalisé, agissant comme une "boucle principale asynchrone". Des bibliothèques comme AsyncContext
(à partir du package Nito.AsyncEx
nuget) fournissent cette fonctionnalité.
<code class="language-csharp">using Nito.AsyncEx; class Program { static void Main(string[] args) { AsyncContext.Run(() => MainAsync(args)); } static async Task MainAsync(string[] args) { // Asynchronous operations here... } }</code>
Alternativement, nous pouvons bloquer explicitement le fil principal jusqu'à ce que les tâches asynchrones concluent:
<code class="language-csharp">class Program { static void Main(string[] args) { MainAsync(args).GetAwaiter().GetResult(); } static async Task MainAsync(string[] args) { // Asynchronous operations here... } }</code>
L'utilisation de GetAwaiter().GetResult()
évite le AggregateException
que Wait()
ou Result
pourrait lancer. Cela garantit une gestion des erreurs plus propre. Choisissez la méthode qui convient le mieux aux besoins de votre projet et à la stratégie de gestion des erreurs.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!