某次调用某个exe,在cmd命令中调用正常,但是一旦使用代码调用则直接假死。
后来了解到原来是输出流阻塞导致的假死,这个时候只需要使用异步读取输出就可以了,直接上代码:
cs
public static bool ExecuteFileConvertHelper(string sPara)
{
try
{
// 获取当前程序所在的目录
string exeDir = AppDomain.CurrentDomain.BaseDirectory;
// 拼接 FileConvert.exe 的完整路径
string exePath = Path.Combine(exeDir, "FileConvert.exe");
// 检查文件是否存在
if (!File.Exists(exePath))
{
LibLogger.LogManager.GetManager().WriteCommon($"FileConvert.exe not found at: {exePath}");
return false;
}
// 创建一个新的进程启动信息
ProcessStartInfo startInfo = new ProcessStartInfo
{
FileName = exePath,
Arguments = sPara,
RedirectStandardOutput = true,
RedirectStandardError = true,
UseShellExecute = false,
CreateNoWindow = true // 不创建窗口
};
// 启动进程
using (Process process = Process.Start(startInfo))
{
// 确保进程不是 null
if (process == null)
{
return false;
}
// 异步读取标准输出
process.OutputDataReceived += (sender, e) =>
{
if (!string.IsNullOrEmpty(e.Data))
{
// 可以在这里处理输出数据,例如记录日志
//LibLogger.LogManager.GetManager().WriteCommon(e.Data);
}
};
// 异步读取标准错误
process.ErrorDataReceived += (sender, e) =>
{
if (!string.IsNullOrEmpty(e.Data))
{
// 可以在这里处理错误数据,例如记录错误日志
//LibLogger.LogManager.GetManager().WriteCommon(e.Data);
}
};
// 开始异步读取
process.BeginOutputReadLine();
process.BeginErrorReadLine();
// 等待进程退出
process.WaitForExit();
// 检查退出代码
if (process.ExitCode == 0)
{
// 成功执行
return true;
}
else
{
// 执行失败
return false;
}
}
}
catch (Exception ex)
{
// 可以在这里记录异常日志
LibLogger.LogManager.GetManager().WriteCommon(ex.Message);
return false;
}
}
谨此纪念。