重定向标准输出/错误不会调用标准输出/错误的事件

时间:2013-02-05 00:54:35

标签: c# httplistener

您好我正在尝试为我的系统构建一个解析器来管理我的Tekkit服务器我正在使用C#但我的Tekkit服务器进程上有RedirectStandardOutput并且有一个方法设置然后将该输出发送给我添加到列表后控制台,但它没有添加到List<string>

这是我的代码:

public void StartServer(string maxMem, string minMem, string path)
{
    ThreadStart server = new ThreadStart(delegate() { StartServerThread(maxMem, minMem, path); });
    server.Invoke();
}

private void StartServerThread(string maxMem, string minMem, string TekkitPath)
{
    try
    {
        TekkitServer.StartInfo.FileName = "java";
        TekkitServer.StartInfo.Arguments = String.Format("-Xmx{0} -Xms{1} -jar \"" + TekkitPath + "\" -nojline nogui", maxMem, minMem);
        TekkitServer.StartInfo.UseShellExecute = false;
        TekkitServer.StartInfo.RedirectStandardInput = true;
        TekkitServer.StartInfo.RedirectStandardOutput = true;
        TekkitServer.OutputDataReceived += new DataReceivedEventHandler(TekkitServer_OutputDataReceived);

        IsStarted = TekkitServer.Start();
        TekkitServerInput = TekkitServer.StandardInput;
    }
    catch (Exception)
    {
    }
}

void TekkitServer_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
    /*B*/recordedData.Add(e.Data);
    Console.Out.WriteLine(e.Data);
}

/*B*/是断点,断点永远不会激活

1 个答案:

答案 0 :(得分:1)

默认情况下,标准输出指向控制台窗口 如果你需要对它做一些事情,你需要重定向它,因此,你需要设置RedirectStandardOutput = true;来触发事件。


编辑:这是我的工作代码(省略错误处理和记录):

public int ExecuteCommand(CommandParameters parameters)
{
  Process process = new Process();
  process.StartInfo.RedirectStandardInput = true;
  process.StartInfo.RedirectStandardOutput = true;
  process.StartInfo.RedirectStandardError = true;
  process.OutputDataReceived += StdOutputHandler;
  process.ErrorDataReceived += StdErrorHandler;
  process.StartInfo.UseShellExecute = false;
  process.StartInfo.FileName = ...;
  process.StartInfo.Arguments = ...;
  process.Start();
  process.BeginErrorReadLine();
  process.BeginOutputReadLine();
  process.WaitForExit(parameters.Timeout);
  return process.ExitCode;
}

private void StdOutputHandler(object sendingProcess, DataReceivedEventArgs outdata)
{
  if (!string.IsNullOrEmpty(outdata.Data))
  {
    OutputMessages.Add(outdata.Data);
  }
}

您的代码中很可能缺少的链接是BeginOutputReadLine,它实际上会获得处理程序方法。

此外,我使用了一个新的Process对象,我等待它完成它的工作,因此不会干扰以前的调用。