Райан решение хорошо работает на окнах. На OSX случались странные вещи, это мог быть тупик на tcs.TrySetResult()
! Есть 2 решения:
Первый:
Перенос tcs.TrySetResult()
в Task.Run ():
public static async Task WaitForExitAsync(this Process process, CancellationToken cancellationToken = default)
{
var tcs = new TaskCompletionSource<bool>();
void Process_Exited(object sender, EventArgs e)
{
Task.Run(() => tcs.TrySetResult(true));
}
process.EnableRaisingEvents = true;
process.Exited += Process_Exited;
try
{
if (process.HasExited)
{
return;
}
using (cancellationToken.Register(() => Task.Run(() => tcs.TrySetCanceled())))
{
await tcs.Task;
}
}
finally
{
process.Exited -= Process_Exited;
}
}
Разговор об этом и более подробно:
Вызов TaskCompletionSource.SetResult неблокирующим образом
Второй:
public static async Task WaitForExitAsync(this Process process, CancellationToken cancellationToken)
{
while (!process.HasExited)
{
await Task.Delay(100, cancellationToken);
}
}
Вы можете увеличить интервал опроса от 100 мс до более в зависимости от вашего приложения.