Проблема заключается в этой строке кода внутри вашей executeCmdCommand()
функции:
process.WaitForExit();
Посмотрите, что в документации говорится об этом методе:
Process.WaitForExit Method |Документы Microsoft
Устанавливает период времени для ожидания завершения связанного процесса, а блокирует текущий поток выполнения до тех пор, пока не истечет время или процесс не завершится.Чтобы не блокировать текущий поток, используйте событие Exited .
Поэтому не следует вызывать этот метод, если вы хотите, чтобы поток пользовательского интерфейса был разблокирован до конца выполнения внешнего процесса,Но если вы все еще хотите получить предупреждение о завершении процесса, вы можете использовать событие Exited
, как указано в документации.
Вы можете найти пример использования события Exited
идругие идеи, здесь:
Форма Windows запускает внешний процесс без блокировки пользовательского интерфейса - Переполнение стека
Я бы добавил только одну вещь к ответу, чтоЯ только что связался: если вы собираетесь скрыть свой PictureBox в обработчике события, вызываемом событием Process.Exited
, вы должны установить ссылку вашего Form
на свойство Process.SynchronizingObject
( документация ), иначе ваш обработчик событий может (в основном, вероятно) выполняться в потоке, отличном от вашего потока пользовательского интерфейса, вызывая ошибку при доступе к чему-либо из вашего Form
, включая элементы управления.
Код может выглядеть следующим образом:
using System.Diagnostics;
public void executeCmdCommand(string argument)
{
Process process = new System.Diagnostics.Process();
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
startInfo.FileName = "cmd.exe";
startInfo.Arguments = $"/C {argument}";
process.StartInfo = startInfo;
process.EnableRaisingEvents = true;
process.SynchronizingObject = this;
process.Exited += (sender, e) => {
HideImage();
};
process.Start();
//process.WaitForExit();
}