using System; using System.Diagnostics; using System.Threading; using System.Threading.Tasks; namespace GodotTools.Core { public static class ProcessExtensions { public static async Task WaitForExitAsync(this Process process, CancellationToken cancellationToken = default(CancellationToken)) { var tcs = new TaskCompletionSource(); void ProcessExited(object sender, EventArgs e) { tcs.TrySetResult(true); } process.EnableRaisingEvents = true; process.Exited += ProcessExited; try { if (process.HasExited) return; using (cancellationToken.Register(() => tcs.TrySetCanceled())) { await tcs.Task; } } finally { process.Exited -= ProcessExited; } } } }