De nombreuses applications nécessitent d'attendre la fin d'autres processus. Par défaut, l'utilisation de Process.WaitForExit() provoque le blocage du thread appelant, ce qui risque de geler l'interface graphique. Cet article explore une approche basée sur les événements pour réaliser une attente de processus asynchrone dans .NET.
Avec les améliorations introduites dans .NET 4.0 et C# 5, nous pouvons représenter avec élégance attente asynchrone à l'aide du modèle asynchrone. L'extrait de code suivant montre comment :
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; }
Pour utiliser la fonctionnalité d'attente asynchrone, invoquez simplement la méthode WaitForExitAsync() sur une instance de Process :
public async void Test() { var process = new Process("processName"); process.Start(); await process.WaitForExitAsync(); //Do some fun stuff here... }
L'approche asynchrone permet à votre interface graphique de rester réactive en attendant la fin du processus. Cela élimine également le besoin de création manuelle de fils de discussion et de délégation d'événements.
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!