Принудительно уничтожить внешний процесс по истечении определенного периода времени - PullRequest
1 голос
/ 16 сентября 2009

У меня есть исполняемый файл командной строки, который запускается из библиотеки классов C #. В некоторых очень редких ситуациях исполняемый файл зависает из-за передаваемых ему данных командной строки. К сожалению, это приводит к зависанию приложения, вызывающего библиотеку c #, в то время как оно бесконечно ждет завершения процесса.

Если командная строка exe не заканчивает выполнение в течение 1 секунды, она никогда не завершится. То, что я хотел бы сделать, это вызвать таймер сразу после запуска процесса и принудительно закрыть процесс, если он не завершился в течение нескольких секунд.

Какой здесь лучший подход? Решение должно оказывать минимальное влияние на производительность, поскольку этот процесс командной строки является узким местом в задаче с высокой повторяемостью.

Редактировать: Любая причина, почему я должен использовать System.Timer вместо Threading.Timer или наоборот?

            ProcessStartInfo startInfo = new ProcessStartInfo();
            startInfo.CreateNoWindow = false;
            startInfo.UseShellExecute = true;
            startInfo.WorkingDirectory = workingDirectory;
            startInfo.FileName = commandLineExe;
            startInfo.WindowStyle = ProcessWindowStyle.Hidden;
            startInfo.Arguments = strArguments;



            // Call WaitForExit and then the using statement will close.
            using (Process exeProcess = Process.Start(startInfo))
            {

                exeProcess.WaitForExit();
            }

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

1 Ответ

5 голосов
/ 16 сентября 2009

Просто добавьте:

// Call WaitForExit and then the using statement will close.
using (Process exeProcess = Process.Start(startInfo)) {
    if(!exeProcess.WaitForExit(1000))
          exeProcess.Kill();
}
...