Viele Anwendungen erfordern das Warten auf den Abschluss anderer Prozesse. Standardmäßig führt die Verwendung von Process.WaitForExit() dazu, dass der aufrufende Thread blockiert wird, was möglicherweise zum Einfrieren der GUI führt. In diesem Artikel wird ein ereignisbasierter Ansatz zum Erreichen eines asynchronen Prozesswartens in .NET untersucht.
Mit den in .NET 4.0 und C# 5 eingeführten Verbesserungen können wir elegant darstellen asynchrones Warten mit dem asynchronen Muster. Der folgende Codeausschnitt zeigt, wie:
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; }
Um die asynchrone Wartefunktion zu nutzen, rufen Sie einfach die WaitForExitAsync()-Methode auf einer Process-Instanz auf:
public async void Test() { var process = new Process("processName"); process.Start(); await process.WaitForExitAsync(); //Do some fun stuff here... }
Der asynchrone Ansatz ermöglicht es Ihrer GUI, reaktionsfähig zu bleiben, während Sie auf das warten Vorgang abzuschließen. Außerdem ist keine manuelle Thread-Erstellung und Ereignisdelegierung mehr erforderlich.
Das obige ist der detaillierte Inhalt vonWie kann ich asynchron auf das Beenden eines Prozesses in .NET warten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!