我有以下代码,它会定期失败并出现 batch did not finish in 20 seconds
错误。
private void executeBat(string batfile)
{
ProcessStartInfo psi = new ProcessStartInfo(batfile);
psi.CreateNoWindow = true;
psi.ErrorDialog = false;
psi.UseShellExecute = false;
psi.RedirectStandardError = false;
psi.RedirectStandardOutput = false;
Process p = Process.Start(psi);
if (!p.WaitForExit(20000))
{
throw new Exception("batch did not finish in 20 seconds.");
}
if (p.ExitCode != 0)
{
throw new Exception("batch failed with exit code " + p.ExitCode + ".");
}
p.Close();
}
最初我以为批处理脚本挂了,但我添加了代码,它实际上在不到一秒钟内运行。
这是批处理脚本:
"c:\Program Files (x86)\SomeThirdParty\SomeExe" >C:\Data\SomeLog.txt 2>&1
set exitcode=%errorlevel%
echo "error return is %exitcode%" >>C:\Data\SomeLog.txt
exit /b %exitcode%
日志文件包含“错误返回为0”
。
.exe 运行正常,表明它更新的数据库更新正常。
每运行 500 次,大约有 1 次发生这种情况。
我如何调试为什么 Process.WaitForExit
在正常运行的情况下返回 false?
我的下一步是删除 20000 并放弃处理挂起的进程。
最佳答案
这是我学到的......
这是在 Task Scheduler 上运行的,而 Task Scheduler 正在终止批处理脚本,因为它运行时间太长。
因此,我将分析的重点从返回非零值的原因转移到批处理脚本未退出或至少未被检测为正在退出的原因。
我将其标记为已解决,即使它并未真正解决。刚刚解释过了。
关于c# - Process.WaitForExit 返回 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48469493/