Я хочу дождаться завершения процесса, но process.WaitForExit()
висит в моем графическом интерфейсе. Есть ли способ, основанный на событиях, или мне нужно порождать поток для блокировки до выхода, а затем делегировать событие самостоятельно?process.WaitForExit() асинхронно
ответ
process.EnableRaisingEvents = true;
process.Exited + = [EventHandler]
для записи, похоже, вы также должны установить 'c4_process.EnableRaisingEvents = true' –
According to this link метод использования System.Diagnostics.Process.Exited
WaitForExit() используется, чтобы сделать текущее ожидание нити до тех пор, пока связанный с ним процесс завершается. Тем не менее, процесс имеет событие «Выход», в которое вы можете подключиться.
Что это? http://msdn.microsoft.com/en-us/library/system.diagnostics.process.exited.aspx –
Неверно, ответ должен быть удален, чтобы не совпадал с downvotes. –
С .NET 4.0/C# 5, это лучше, чтобы представить это, используя шаблон асинхронной.
/// <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))
{
var tcs = new TaskCompletionSource<object>();
process.EnableRaisingEvents = true;
process.Exited += (sender, args) => tcs.TrySetResult(null);
if(cancellationToken != default(CancellationToken))
cancellationToken.Register(tcs.SetCanceled);
return tcs.Task;
}
Использование:
public async void Test()
{
var process = new Process("processName");
process.Start();
await process.WaitForExitAsync();
//Do some fun stuff here...
}
Спасибо, это было полезно. Одна вещь, с которой я столкнулся, заключается в том, что 'tcs.SetResult (null)' выдает 'InvalidOperationException', если задача уже отменена, что может произойти, если процесс завершается после отмены задачи. Чтобы исправить это, я заменил 'tcs.SetResult' на' tcs.TrySetResult'. –
@aj_r Хороший совет. Благодарю. Я сделал обновление. – MgSam
Если процесс остановится, прежде чем мы зарегистрируем наш обработчик Exited, мы будем ждать навсегда. Регистрация должна быть выполнена до начала, так что гораздо проще написать метод StartAsync. В основном такой же код, но с именем StartAsync с process.Start() juste перед обратной линией. – MuiBienCarlota
Если вы выбираете @MgSam ответ, быть в курсе, если вы проходите через WaitForExitAsync
некоторые CancellationToken
, которые будут автоматически отменены после указанной задержки, вы можете получить InvalidOperationException
. Чтобы исправить это, вам нужно изменить
cancellationToken.Register(tcs.SetCanceled);
к
cancellationToken.Register(() => { tcs.TrySetCanceled(); });
P.S .: Не забудьте утилизировать свой CancellationTokenSource
вовремя.
Это P.S. спас мою жизнь.... – Fazi
- 1. Process.WaitForExit (Int32)
- 2. process.waitforexit hangs
- 3. почему Process.WaitForExit не ждет?
- 4. Process.WaitForExit() вызывает NullReferenceException
- 5. Process.WaitForExit несовместим для разных машин
- 6. Process.WaitForExit не запускается с __debugbreak
- 7. Моя программа застревает в Process.WaitForExit();
- 8. Сбор результатов асинхронно инициированного процесса
- 9. Process.WaitForExit(), не дожидаясь несколько Chrome экземпляров
- 10. Тема прерывалась ошибка при использовании process.waitforexit()
- 11. Process.WaitForExit() на консоли и Windows Forms
- 12. Как не замерзать в VB.NET, а Process.WaitForExit()?
- 13. Как ждать выходных потоков, когда Process.WaitForExit используется с жестким таймаутом
- 14. OpenRead асинхронно
- 15. process.WaitForExit() никогда не получает сигнал выхода. Не продолжается через программу
- 16. Почему Process.WaitForExit генерирует исключение «без процесса», даже если процесс существует?
- 17. Как узнать, закончилось ли Process.WaitForExit() из-за закрытия основного приложения
- 18. Process.WaitForExit() намного медленнее после рефакторинга при вызове Taskkill
- 19. DeleteFile из EXE сразу после Process.WaitForExit терпит неудачу
- 20. Выполнение внешних процессов асинхронно в службе Windows
- 21. загрузка файла JS асинхронно из JS-файла, который загружает асинхронно
- 22. Чтобы асинхронно или не пытаться асинхронно в node.js?
- 23. Firebase, получение данных асинхронно
- 24. Асинхронно рисовать datagridview
- 25. Почему так долго асинхронно?
- 26. Скачать изображение асинхронно
- 27. CsvHelper - Считывающий поток асинхронно
- 28. $ асинхронно, необходимо быть синхронным
- 29. MongoDB получить результаты асинхронно
- 30. Чтение InputStream асинхронно
Настоящая ** реализация async ** 'Process', которая позволяет также перенаправить стандартные выходные и стандартные потоки ошибок http://stackoverflow.com/a/39872058/1212017. –