public static Task WaitForExitAsync(this Process process, CancellationToken cancellationToken = default(CancellationToken)) {
try {
var tcs = new TaskCompletionSource<object>();
process.EnableRaisingEvents = true;
process.Exited += (sender, args) => tcs.TrySetResult(null);
if (cancellationToken != default(CancellationToken)) {
cancellationToken.Register(() => { tcs.TrySetCanceled(); });
}
return tcs.Task;
} catch (Exception) {
return WaitForExitAsyncFallback(process, cancellationToken);
}
}