В нашем приложении есть фоновый поток, который запускает процесс через System.Diagnostics.Process
:
Process.Start(
new ProcessStartInfo
{
FileName = url,
UseShellExecute = true
}
);
Раньше у него вообще не было проблем.Но теперь фоновый поток молча умирает;он никогда не возвращается из звонка на Process.Start
.Блок catch для этого кода, который обрабатывает System.Exception
, также не достигается.Даже если я включаю обработку исключений, когда они появляются в отладчике Visual Studio, я не вижу исключений.Странно, процесс порождается просто отлично;браузер по умолчанию для пользователя запускается с ожидаемым URL-адресом.
Точка входа нашего процесса помечена [STAThread]
, как рекомендовано.
Что может вызывать молчаливое завершение потока?Есть ли какие-либо методы, которые я могу использовать для отладки того, что происходит во время завершения потока?
Обновление:
Похоже, что поток все-таки жив;он просто не возвращается с звонка.Вот его трассировка стека:
- [В режиме ожидания или присоединения]
- System.dll! System.Diagnostics.ShellExecuteHelper.ShellExecuteOnSTAThread () + 0x63 байта
- System.dll! System.Diagnostics.Process.StartWithShellExecuteEx (System.Diagnostics.ProcessStartInfo startInfo) + 0x19d байт
- System.dll! System.Diagnostics.Process.Start () + 0x39 байт
- System.dll! System.Diagnostics.Process.Start (System.Diagnostics.ProcessStartInfo startInfo) + 0x32 байта
- Мой метод
Обновление 2:
Запуск cmd.exe без использования оболочки для выполнения работ в качестве обходного пути.Огромное спасибо!Тем не менее, я все еще хотел бы знать , почему звонок не возвращается.
Обновление 3:
Захваты оболочки звучат каклогичное объяснение того, что может быть причиной того, что звонок не вернулся.Я не смог найти модуль-мошенник, но после последней попытки выполнить все через выполнение оболочки вызов сделал return.
В любом случае, возможно, что у пользователей могут быть расширения оболочкизагружен, что может мешать запуску процесса и не возвращать мой код.Мы ничего не можем сделать с этим , поэтому правильный ответ - использовать обходной путь запуска процесса cmd.exe.