C# Process.WaitForExit()触发器太快
下面是我用来从c#代码运行extern可执行文件(非托管)的代码: 在我的例子中,如果我手动启动解算器,它大约工作30秒。solver.exe操作的结果是一个文件。但当我从代码中调用它时,它几乎在同一时刻退出,什么也不做。没有来自它的输出,没有生成输出文件C# Process.WaitForExit()触发器太快,c#,.net,process,C#,.net,Process,下面是我用来从c#代码运行extern可执行文件(非托管)的代码: 在我的例子中,如果我手动启动解算器,它大约工作30秒。solver.exe操作的结果是一个文件。但当我从代码中调用它时,它几乎在同一时刻退出,什么也不做。没有来自它的输出,没有生成输出文件 此外,进程启动正确,不会抛出错误。上面的代码中是否有任何问题,或者我应该从检查solver.exe开始吗?您的过程可能以无法预料的方式失败。您只能知道如何读取输出和错误流并将其存储在文件中(或将其写入控制台或事件日志) 请记住,如果需要同时读
此外,进程启动正确,不会抛出错误。上面的代码中是否有任何问题,或者我应该从检查solver.exe开始吗?您的过程可能以无法预料的方式失败。您只能知道如何读取输出和错误流并将其存储在文件中(或将其写入控制台或事件日志) 请记住,如果需要同时读取错误和输出流以异步/事件驱动方式执行此操作,请执行以下操作。否则,流将阻塞,不会产生任何输出或不是您所追求的输出
StreamWriter errorReporter = new StreamWriter("SOLVER-OUTPUT-ERROR.txt", true);
newproc.StartInfo.RedirectStandardOutput = true;
newproc.StartInfo.RedirectStandardError = true;
newproc.OutputDataReceived += (sender, args) => errorReporter.WriteLine(args.Data);
newproc.ErrorDataReceived += (sender, args) => errorReporter.WriteLine(args.Data);
newproc.StartInfo.UseShellExecute=false;
newProc.Start();
newProc.BeginOutputReadLine();
newProc.BeginErrorReadLine();
newProc.WaitForExit();
errorReporter.Close();
如果您尝试了
UseShellExecute=false
会发生什么情况似乎不太可能不需要告诉名为“solver”的程序要解决什么问题。使用StartInfo.Arguments属性传递命令行参数。@HansPassant完全同意:)在求解之前生成了一些输入文件,不需要参数。感谢您的关注。如果在ProcessStartInfo上乱搞无济于事,您可能需要调试从代码启动时执行的解算器。一个调试器以及在解算器上的日志记录/跟踪,再加上诸如Sysinternals Process Explorer之类的工具,将大有帮助。使用Process Explorer检查环境变量和解算器的执行目录。使用调试器+日志记录/跟踪来了解解算器内部发生了什么,是否引发了异常等。
StreamWriter errorReporter = new StreamWriter("SOLVER-OUTPUT-ERROR.txt", true);
newproc.StartInfo.RedirectStandardOutput = true;
newproc.StartInfo.RedirectStandardError = true;
newproc.OutputDataReceived += (sender, args) => errorReporter.WriteLine(args.Data);
newproc.ErrorDataReceived += (sender, args) => errorReporter.WriteLine(args.Data);
newproc.StartInfo.UseShellExecute=false;
newProc.Start();
newProc.BeginOutputReadLine();
newProc.BeginErrorReadLine();
newProc.WaitForExit();
errorReporter.Close();