Maison >développement back-end >C++ >Comment puis-je attendre de manière asynchrone la sortie d'un processus dans .NET sans bloquer l'interface graphique ?

Comment puis-je attendre de manière asynchrone la sortie d'un processus dans .NET sans bloquer l'interface graphique ?

Patricia Arquette
Patricia Arquetteoriginal
2025-01-05 05:34:43204parcourir

How Can I Asynchronously Wait for a Process to Exit in .NET without Blocking the GUI?

Attendre la sortie asynchrone des processus

Il peut être difficile d'attendre la fin d'un processus sans bloquer l'interface graphique à l'aide de Process.WaitForExit( ). Pour résoudre ce problème, explorons une approche basée sur les événements et une solution alternative utilisant le modèle asynchrone.

Dans les versions .NET antérieures à 4.0, il était nécessaire de créer un thread séparé pour attendre la sortie et déclencher un événement. Cependant, avec l'introduction de la programmation asynchrone dans .NET 4.0 et C# 5, nous pouvons désormais représenter ce processus de manière plus élégante.

Attente asynchrone à l'aide d'async et wait

Le Le modèle asynchrone nous permet d'attendre que le processus se termine de manière asynchrone. Voici un exemple :

/// <summary>
/// Waits asynchronously for the process to exit.
/// </summary>
/// <param name="process">The process to wait for cancellation.</param>
/// <param name="cancellationToken">A cancellation token. If invoked, the task will return immediately as canceled.</param>
/// <returns>A Task representing waiting for the process to end.</returns>
public static Task WaitForExitAsync(this Process process, 
CancellationToken cancellationToken = default(CancellationToken))
{
    if (process.HasExited) return Task.CompletedTask;

    var tcs = new TaskCompletionSource<object>();
    process.EnableRaisingEvents = true;
    process.Exited += (sender, args) => tcs.TrySetResult(null);
    if(cancellationToken != default(CancellationToken))
        cancellationToken.Register(() => tcs.SetCanceled());

    return process.HasExited ? Task.CompletedTask : tcs.Task;
}

Utilisation :

public async void Test() 
{
   var process = new Process("processName");
   process.Start();
   await process.WaitForExitAsync();

   //Do some fun stuff here...
}

En utilisant la méthode d'extension WaitForExitAsync, vous pouvez attendre que le processus se termine de manière asynchrone sans bloquer l'interface graphique. . Le mot clé wait suspend l'exécution de la méthode Test jusqu'à ce que le processus se termine ou que le jeton d'annulation soit déclenché.

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