Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Process.WaitForExit()触发器太快_C#_.net_Process - Fatal编程技术网

C# Process.WaitForExit()触发器太快

C# Process.WaitForExit()触发器太快,c#,.net,process,C#,.net,Process,下面是我用来从c#代码运行extern可执行文件(非托管)的代码: 在我的例子中,如果我手动启动解算器,它大约工作30秒。solver.exe操作的结果是一个文件。但当我从代码中调用它时,它几乎在同一时刻退出,什么也不做。没有来自它的输出,没有生成输出文件 此外,进程启动正确,不会抛出错误。上面的代码中是否有任何问题,或者我应该从检查solver.exe开始吗?您的过程可能以无法预料的方式失败。您只能知道如何读取输出和错误流并将其存储在文件中(或将其写入控制台或事件日志) 请记住,如果需要同时读

下面是我用来从c#代码运行extern可执行文件(非托管)的代码:

在我的例子中,如果我手动启动解算器,它大约工作30秒。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();