0

嗨,我正在尝试为我的系统构建一个解析器来管理我的 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*/,断点永远不会激活

4

1 回答 1

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对象,并等待它完成它的工作,因此不会干扰以前的调用。

于 2013-02-05T00:56:40.093 回答