Я разработал Windows Service Process под названием WSP, который вызывает плохо документированное внешнее консольное приложение, разработанное крупной компанией, также известной как External.exe.
Мой WSP работает каждые 2 часа без ошибок, вызывая External.exe, который выполняется отлично.Иногда я не знаю почему, External.exe завершается с кодом ошибки <> 0. Как я уже говорил, документации по этому вопросу нет, и она случайная.
Проблема в том, что: External.exe возвращает код <> 0, все последующие вызовы External.exe завершатся неудачно.
Чтобы решить эту проблему, мне нужно перезапустить WSP вручную в Services.msc (да, я попытался перезапустить WSP программно, и, как язнать, что служба не может перезапустить себя).После этого все шаги в WSP работают как положено.
У кого-нибудь была такая проблема?
private static bool ExecuteCommandLineTransformProcess(string inputFullPath, string transformerCommandLine)
{
var success = false;
var info = new ProcessStartInfo("cmd.exe", transformerCommandLine);
info.CreateNoWindow = true;
info.WindowStyle = ProcessWindowStyle.Hidden;
info.RedirectStandardOutput = true;
info.UseShellExecute = false;
//Launching External.EXE tool with parameters
using (var pr = Process.Start(info))
{
pr.WaitForExit();
if (pr.HasExited)
{
//pr.ExitCode is the return off external window process, expected 0 when no errorsfound
success = pr.ExitCode == 0;
if (pr.ExitCode != 0)
{
LoggerHelper.Log.Warn($"Transformer - Finished - ##With errors!!! : {pr.ExitCode} .");
//After This Error, all callings to External.Exe will fail silently (not working and ExitCode as 0)
}
LoggerHelper.Log.Info($"Transformer - Finished.");
pr.Refresh();
}
}
return success;
}
Я посмотрел на TaskManager и External.Exe, по-видимому, не работает в фоновом режиме;Я попытался обойти принудительный перезапуск в WSP, но, как я уже сказал, WindowsService не может перезапустить себя;И да, я искал в Переполнении стека, в Google и в Документах по поставкам для большой компании.
Я принимаю все идеи и заранее благодарен
....
Обновление, япопытался форсировать Throw New, за исключением случая ExitCode! = 0 ... и неожиданно WSP все еще жив и не вызывает перезапуск WSP, авто-перезапуск.В поисках этого я нашел много предложений, таких как: «Создайте другой процесс, чтобы принудительно перезапустить это»;«Отправить CMD KillProcess в WSP» ... Это не варианты для меня.
Сейчас я тестирую другой подход, использую WSP.Dispose () (который наследуется от класса ServiceBase) при каждом завершении выполнения.,К настоящему времени я опубликовал WSP в тестовой среде и все еще жду.