Process.Start блокируется / зависает случайным образом на некоторых клиентах - PullRequest
7 голосов
/ 18 апреля 2011

(Существует очень похожая тема, которая так и не была решена: здесь )

У нас большое приложение, работающее на нескольких клиентах, но недавно часть моего кода перестала работать.Добавляя некоторый отладочный код, я обнаружил, что код останавливается при вызове Process.Start () (без установки shellexecute = true).

Это простой вызов

 Process.Start(new ProcessStartInfo("program"))    

вТема BackgroundWorker.

Приложение "программа" делает то, что должно делать, и завершает работу.

Наше приложение продолжает работу, поскольку поток находится в фоновом режиме, но если приложение запускает другой Process.Start в потоке GUI,приложение блокируется.Если приложение закрывается с помощью кнопки X, оно все равно отображается в диспетчере задач, поскольку поток по-прежнему блокируется процессом. Запуск.

Проблема заключается в том, что это поведение невозможно воспроизвести.Это происходит случайным образом на некоторых клиентских компьютерах.

Что может произойти, чтобы Process.Start () зависал?(Program.Main помечен [STAThread])

В настоящее время я только что сделал обходной путь, который запускает Process.Start () в его собственном потоке, убивая его через 5 секунд, если он не вернулся к тому времени.Но это 5 секунд для пользователя, ожидающего возврата кода (я не знаю, насколько низким я могу установить тайм-аут, так как в некоторых случаях мне нужно возвращаемое значение для Process.Start ()).

Могут ли антивирусные программы вмешиваться?(на клиентах установлен Symantec AV)

ОБНОВЛЕНИЕ: Я предполагал, что когда я сделал

ProcessStartInfo psi = new ProcessStartInfo("ping", "localhost");

, то psi.UseShellExecute был ЛОЖЬ по умолчанию ... Это не правильно.По умолчанию TRUE.Это нормально?

Ответы [ 2 ]

8 голосов
/ 15 февраля 2012

Я понимаю, что эта ветка довольно старая, но если кому-то интересно, это вызвано расширением оболочки (в данном случае антивирусным программным обеспечением). По сути, когда вы начинаете с UseShellExecute = true (по умолчанию), антивирусное программное обеспечение мешает работе Processor.Start и вызывает зависание (кажется случайным). Интересно, что процесс запускается просто отлично, зависает поток вызывающего.

У нас была та же проблема с включенной защитой Symantec Virus на одном из серверов нашего клиента. Мы исправили это, установив исключения для антивирусного программного обеспечения. Кроме того, вы можете отключить UseShellExecute.

1 голос
/ 18 апреля 2011

Некоторое время назад у меня была проблема, когда обработка внешнего процесса могла привести к состоянию гонки, если что-то еще считывало вывод программы в неподходящее время. Может ли это быть тем, что вы видите?

Дополнительная информация о статье MSDN на StandardOutput .

edit: память медленно возвращается. Я использовал process.ReadToEnd () после process.WaitforExit (). Выходной буфер довольно мал, поэтому эффективно заполнялся, затем останавливался, ожидая, пока что-нибудь (я, то есть вызывающий процесс) прочитает это. Что, конечно, не получилось, потому что мой код все еще ждал завершения процесса.

Установка process.ReadToEnd () до WaitForExit () исправил это для меня, хотя это звучит довольно интуитивно. Но если вы не выкладываете подробный вывод на консоль, то это, вероятно, что-то совсем другое ...

...