Process.WaitForExit()触发太快

时间:2013-07-30 19:49:16

标签: c# .net process

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

static void Solve()
            {
                Process newProc = new Process();
                newProc.StartInfo.WorkingDirectory =  Path.Combine(Directory.GetCurrentDirectory(), "Data");
                newProc.StartInfo.FileName = "solver.exe";
                newProc.StartInfo.CreateNoWindow = true;
                newProc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
                try
            {
                newProc.Start();
                newProc.WaitForExit();

            }
            catch (Exception e)
            {
            StreamWriter errorReporter = new StreamWriter("ErrorLog.txt", true);
    errorReporter.WriteLine(message);
    errorReporter.Close();

            }
            newProc.Close();
        }

在我的情况下,如果我手动启动它,解算器大约需要30秒。 solver.exe操作的结果是一个文件。但是当我从代码中调用它时,它几乎在同一时刻退出并且什么都不做。没有输出,输出文件没有生成。

此外,进程正确启动,不会抛出任何错误。上面的代码中是否有任何问题,或者我应该从检查solver.exe开始?

1 个答案:

答案 0 :(得分:2)

您的过程可能以无法预料的方式失败。您只能知道读取输出和错误流并将其存储在文件中(或将其写入控制台或事件日志)

请记住,如果您需要同时读取错误和输出流以执行async / eventdriven。否则,流将阻塞并且不会产生任何输出,或者不会产生您输出的输出。

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();