Process.WaitForExit() 触发速度太快

问题描述 投票:0回答:1

这是我用来从 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开始?

c# .net process
1个回答
3
投票

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

请记住,如果您需要同时读取错误和输出流以异步/事件驱动。否则,流将阻塞并且不会产生任何输出或不是您想要的输出。

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();
© www.soinside.com 2019 - 2024. All rights reserved.