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
Libérer: 2025-01-05 05:34:43
original
208 Les gens l'ont consulté

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

Utilisation :

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

   //Do some fun stuff here...
}
Copier après la connexion

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!

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