Maison > développement back-end > C++ > Comment puis-je éviter le gel de l'interface graphique en attendant la fin du processus asynchrone en C# ?

Comment puis-je éviter le gel de l'interface graphique en attendant la fin du processus asynchrone en C# ?

DDD
Libérer: 2025-01-04 22:05:41
original
841 Les gens l'ont consulté

How Can I Avoid GUI Freezes When Waiting for Asynchronous Process Completion in C#?

Achèvement d'un processus asynchrone avec Process.WaitForExit()

En attendant la fin d'un processus à l'aide de Process.WaitForExit(), on peut rencontrer un gel de l'interface graphique en raison de la nature bloquante de la méthode. Pour surmonter ce problème, envisagez d'utiliser une approche basée sur les événements.

Dans .NET 4.0 et C# 5, le modèle asynchrone fournit une solution élégante à ce problème. La méthode d'extension WaitForExitAsync vous permet d'attendre de manière asynchrone la fin d'un processus. Voici le code :

/// <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

Avec WaitForExitAsync, vous pouvez attendre la fin d'un processus sans bloquer votre interface graphique. Il utilise une approche basée sur les événements pour notifier le code appelant lorsque le processus se termine, permettant ainsi une expérience utilisateur plus réactive et interactive.

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal