2014-01-28 3 views
2

Я пытаюсь выполнить команду через cmd, но когда программа запускается, все окно застревает и не реагирует. Не может нажимать на кнопки, не может закрыть форму и т.д. Это код для исполнения:Windows Form застрял во время выполнения cmd.exe

private void buttonStartTests_Click(object sender, EventArgs e) 
    { 
     String command = @"/c perl script.pl"; 
     ProcessStartInfo cmdsi = new ProcessStartInfo("cmd.exe"); 
     cmdsi.Arguments = command; 
     cmdsi.UseShellExecute = false; 
     cmdsi.RedirectStandardOutput = true; 
     cmdsi.RedirectStandardError = true; 
     cmdsi.RedirectStandardInput = true; 

     cmdsi.CreateNoWindow = true; 

     Process cmd = Process.Start(cmdsi); 

     String outstr; 

     while ((outstr = cmd.StandardOutput.ReadLine()) != null) 
     { 
      this.richTextBoxTestOutput.Text += (outstr + "\n"); 
      this.richTextBoxTestOutput.Update(); 
     } 

     //Wait for process to finish 
     //cmd.WaitForExit(); 

     cmd.Close(); 
    } 

Возникает вопрос: как предотвратить это застрять?

Редактировать: Форма становится отзывчивой снова после завершения команды (только для того, чтобы все было ясно).

+0

Вы можете использовать функции .net 4.5, такие как 'await' и' async' –

+0

как есть, это не асинхронно, поэтому он выполняет весь код в порядке, а остальная часть приложения ждет на нем. Окно становится неактивным, когда этот обработчик событий запускается и никогда не возвращается в реагирующее состояние, потому что все, что происходит в этом событии, никогда не завершается. Вы можете попробовать установить точку останова на событии, затем перейти в код, чтобы увидеть, где его повесили. –

+0

@ user116969 если мой ответ помог вам, пожалуйста, подумайте над тем, чтобы использовать его как правильный ответ. –

ответ

4

вы должны рассмотреть, начиная ЦМД в качестве фонового процесса -

я думаю, что так, как вы это делаете, то mainthread будет отвечать на запросы, пока CMD не обеспечивает возврат ..? Таким образом, он блокирует mainthread.

Возможно, на рабочий стол может быть вариант.

+0

да, именно то, что я только что набрал. Вероятно, это основной поток, и он будет работать лучше на фоне рабочего или собственного потока. Его не сразу ясно для меня, почему он не становится отзывчивым снова, когда команда завершается ... если она никогда не завершается ... –

Смежные вопросы