C# 通过process.Start(startInfo)在另一个进程上的奇怪行为 我们的C(V3.5)应用程序需要调用另一个公司的C++可执行文件。我们需要向它传递一个原始数据文件名,它将处理该原始数据(大约7MB)文件并生成16个结果文件(每个文件大约124K)
调用该可执行文件的代码如下:C# 通过process.Start(startInfo)在另一个进程上的奇怪行为 我们的C(V3.5)应用程序需要调用另一个公司的C++可执行文件。我们需要向它传递一个原始数据文件名,它将处理该原始数据(大约7MB)文件并生成16个结果文件(每个文件大约124K),c#,.net,C#,.net,调用该可执行文件的代码如下: ProcessStartInfo startInfo = new ProcessStartInfo(); startInfo.CreateNoWindow = true; startInfo.UseShellExecute = false; startInfo.RedirectStandardError = true; startInfo.RedirectStandardOutput = true; startInfo.WindowStyle = ProcessWi
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.CreateNoWindow = true;
startInfo.UseShellExecute = false;
startInfo.RedirectStandardError = true;
startInfo.RedirectStandardOutput = true;
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
startInfo.FileName = exePath;
startInfo.Arguments = rawDataFileName;
try
{
Process correctionProcess = Process.Start(startInfo);
correctionProcess.WaitForExit();
}
catch(nvalidOperationException ex)
{
....
}
catch(...)
...
它很好用。现在我们有了新的原始数据。用新的原始数据文件替换旧的原始数据后。那个可执行的过程永远不会回到我们身边。它将永远悬挂。如果我们杀死C#应用程序,这些结果文件将在目标目录中生成。看起来,可执行文件确实创建了这些结果文件,但在进程终止之前,无法写入磁盘并返回给我们
旧的原始数据文件不是这样的
当我们直接使用新的原始数据运行可执行文件时(C#app调用中没有),它工作正常。这意味着这个可执行文件对新的原始数据没有问题
我的问题1:这种行为的可能原因是什么
现在我用startInfo.UseShellExecute=true来更改代码代码>并添加startInfo.WorkingDirectory=…,
并禁用
//startInfo.RedirectStandardError = true;
//startInfo.RedirectStandardOutput = true;
然后它就起作用了
我的问题2:为什么使用Windows Shell解决此问题
我的问题3:为什么以前不使用Shell就可以工作
我的问题4:什么时候应该使用Shell,什么时候不应该
谢谢,我知道这是一个很常见的问题。我必须处理输出,它必须异步处理。当输出超过一定数量的数据时,就不能等待ForExit
您需要添加
myStdErr= correctionProcess.StandardError.ReadToEnd();
通常只有一次有效,如果你想过度使用它(“p”是我的流程)
有几种可能性:
- 您正在重定向输出和错误,但没有读取它。当进程的stdout或stderr缓冲区已满时,进程将暂停
- 程序可能正在显示错误消息并等待按键。您既没有重定向输入,也没有检查stderr,按键永远不会出现
- 有些程序,xcopy.exe就是一个很好的例子,在重定向stdout时需要重定向stdin。虽然xcopy.exe的故障模式是立即退出,但没有任何诊断
当你杀死你的C#程序时看到它被修复了,这使得第一个子弹成为最有可能的原因。如果你不需要stdout/stderr,只需将Redirect*属性设置为false。是的,如果我关闭那些重定向属性,它就会工作,但是如果我已经把它们戴上并读到最后,为什么它不起作用呢?我已经测试了几种不同的组合。我发现只有两个案例适合我:1。使用窗框;2.不使用窗口外壳,不重定向错误和输出。不知道为什么。我已经打印了(到日志文件)以从重定向错误和输出中获取字符串。但没有任何记录。这意味着根本没有错误或输出消息!如果您使用shell,那么您将永远不会重定向、扣篮以获得修复,除了显示的控制台窗口。如果你没有看到它,那么它可能隐藏在你自己的窗口后面,考虑问题得到解决。如果不启用shell和重定向,那么读取stdout和stderr是一项困难的要求。您还没有向我们展示该代码是什么样子的。我在这篇文章中添加了代码:呃,您希望我回答哪一个?
while (!P.HasExited)
stdErr+= P.StandardError.ReadToEnd();