Heim >Backend-Entwicklung >C++ >Wie kann ich asynchron auf das Beenden eines Prozesses in .NET warten, ohne die GUI zu blockieren?

Wie kann ich asynchron auf das Beenden eines Prozesses in .NET warten, ohne die GUI zu blockieren?

Patricia Arquette
Patricia ArquetteOriginal
2025-01-05 05:34:43165Durchsuche

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

Warten, bis Prozesse asynchron beendet werden

Es kann schwierig sein, auf den Abschluss eines Prozesses zu warten, ohne die GUI mit Process.WaitForExit( zu blockieren ). Um dieses Problem anzugehen, untersuchen wir einen ereignisgesteuerten Ansatz und eine alternative Lösung unter Verwendung des asynchronen Musters.

In .NET-Versionen vor 4.0 war es notwendig, einen separaten Thread zu erstellen, um auf den Exit zu warten und einen auszulösen Ereignis. Mit der Einführung der asynchronen Programmierung in .NET 4.0 und C# 5 können wir diesen Prozess jedoch nun eleganter darstellen.

Asynchrones Warten mit async und waiting

The Mit dem asynchronen Muster können wir warten, bis der Prozess asynchron beendet wird. Hier ist ein Beispiel:

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

Verwendung:

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

   //Do some fun stuff here...
}

Mit der Erweiterungsmethode WaitForExitAsync können Sie warten, bis der Prozess asynchron beendet wird, ohne die GUI zu blockieren . Das Schlüsselwort „await“ unterbricht die Ausführung der Testmethode, bis der Prozess abgeschlossen ist oder das Abbruchtoken ausgelöst wird.

Das obige ist der detaillierte Inhalt vonWie kann ich asynchron auf das Beenden eines Prozesses in .NET warten, ohne die GUI zu blockieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn