我开发了一个名为WSP的Windows服务进程,它调用由一家大公司开发的外部控制台应用程序(也称为External.exe),该应用程序的文档记录很差。
我的WSP每2小时运行一次,没有错误,调用External.exe,它执行得很好。有时候,我不知道为什么,External.exe以错误代码〈〉0结束。正如我之前所说,没有关于它的文档,它是随机的。
问题是:当External.exe返回代码〈〉0时,对External.exe的所有后续调用都将失败。
要解决这个问题,我必须在Services. msc中手动重新启动WSP(是的,我尝试过以编程方式重新启动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不能自行重新启动;是的,我在堆栈溢出、谷歌和大公司供应文档中搜索过。
我接受所有建议并提前表示感谢
...
更新,我试图强制抛出新的,除了在ExitCode!= 0的情况下...和惊喜,WSP仍然活着,不调用重新启动WSP自动重新启动.搜索有关这一点,我发现了很多建议,如:"创建另一个进程以强制此进程重新启动"; "发送CMD KillProcess到WSP"...它们对我来说不是选项。
现在我正在测试另一种方法,我正在使用WSP.Dispose()(它继承自ServiceBase类)完成每个执行。到目前为止,我已经在测试环境中发布了WSP,我仍然在等待。
3条答案
按热度按时间gfttwv5a1#
服务可以使用服务属性的“恢复”选项卡中的选项自行重新启动:
当外部可执行文件错误引发异常,终止服务执行,恢复选项卡中的设置将启动并重新启动服务...
您还可以创建另一个Windows服务,如果External.exe返回代码〈〉0,则您的“WSP”服务将使用IPC (Interprocess communications)发出警报,其唯一目的是在收到警报时重新启动“WSP”服务。
ndasle7k2#
我最好的猜测是:- 进程信息保留在内存中,未正确释放-服务和External.exe同时使用的文件被锁定,因此External.exe因无法访问而失败。重新启动服务时,锁定将被释放,从而修复了此问题。
kpbwa7wx3#
谢谢Dean
我知道如何在失败时自动重启/恢复服务,但我不知道这是否是一个好的实践。在我的例子中,pr.ExitCode!= 0是一个可能的结果,我正在记录它。在另一方面,我选择不抛出新的异常。我以前想过,但我对这种方法不满意