Maison > développement back-end > C++ > Comment puis-je exécuter du code asynchrone dans la méthode principale d'une application de console?

Comment puis-je exécuter du code asynchrone dans la méthode principale d'une application de console?

Linda Hamilton
Libérer: 2025-02-01 17:01:08
original
195 Les gens l'ont consulté

How Can I Run Asynchronous Code in a Console Application's Main Method?

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal