Maison >développement back-end >C++ >Comment puis-je attendre de manière asynchrone la sortie du processus en C# sans geler l'interface graphique ?

Comment puis-je attendre de manière asynchrone la sortie du processus en C# sans geler l'interface graphique ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-04 14:25:43436parcourir

How Can I Asynchronously Wait for Process Exit in C# Without Freezing the GUI?

Attente de la sortie d'un processus de manière asynchrone

Dans de nombreuses applications, il est essentiel d'attendre la sortie d'un processus avant de continuer. Cependant, l'utilisation de Process.WaitForExit() peut provoquer le blocage de l'interface utilisateur graphique (GUI). Pour éviter ce problème, une solution basée sur les événements ou sur les threads est requise.

Approche basée sur les événements

À partir de .NET 4.0/C# 5, l'async Le motif offre une manière plus élégante de représenter le processus d’attente. La méthode WaitForExitAsync() peut être ajoutée à la classe Process, permettant à l'application d'attendre de manière asynchrone la fin du processus :

public static Task WaitForExitAsync(this Process process, CancellationToken cancellationToken = default(CancellationToken))

À l'intérieur de la méthode :

  • Si le processus est déjà terminé, la méthode renvoie immédiatement une tâche terminée.
  • Sinon, un TaskCompletionSource est créé et la propriété EnableRaisingEvents du processus est définie sur true.
  • Un gestionnaire d'événements est attaché à l'événement Exited du processus, qui définit le résultat de la source d'achèvement de la tâche à la fin du processus.
  • Si un jeton d'annulation est fourni, il est enregistré pour annuler la tâche s'il est invoqué.
  • La tâche est renvoyée, qui est terminée à la fin du processus ou lorsque le jeton d'annulation est invoqué.
  • Utilisation

    Pour utiliser la méthode WaitForExitAsync() :

    public async void Test()
    {
        var process = new Process("processName");
        process.Start();
        await process.WaitForExitAsync();
    
        // Do some fun stuff here...
    }

    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!

    Déclaration:
    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