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

C# 重定向标准输出/错误不会调用标准输出/错误的我的事件,c#,httplistener,C#,Httplistener,嗨,我正在尝试为我的系统构建一个解析器来管理我的Tekkit服务器我正在使用C#但是我在我的Tekkit服务器进程上重定向了StandardOutput,并且有一个方法设置,可以在添加到列表后将该输出发送到我的控制台,但它没有添加到列表 这是我的密码: public void StartServer(string maxMem, string minMem, string path) { ThreadStart server = new ThreadStart(delegate() {

嗨,我正在尝试为我的系统构建一个解析器来管理我的Tekkit服务器我正在使用C#但是我在我的Tekkit服务器进程上重定向了StandardOutput,并且有一个方法设置,可以在添加到列表后将该输出发送到我的控制台,但它没有添加到
列表

这是我的密码:

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*/
是断点时,默认情况下断点从不激活,标准输出指向控制台窗口。
如果需要对其执行某些操作,则需要重定向它,因此,需要设置
RedirectStandardOutput=true


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

代码中最可能缺少的链接是实际获取处理程序方法的


另外,我使用一个新的
进程
对象,并等待它完成它的工作,因此,不可能干扰以前的调用。

需要考虑的其他事项:可能是写入StandardError。@AustinSalonen检查了它没有发生。出于某种原因,我的应用程序从未处理过输出。我尝试过这个方法,但它不起作用,因此,我之所以尝试关闭它,是因为我缺少
TekkitServer.EnableRaisingEvents=true你没有显示过的witch,所以不确定没有它为什么它不能在我的上工作?我可以确认我没有设置
EnableRaisingEvents
属性,从中可以看出,它似乎只涉及
退出的
事件(我也没有)。但是,我确实有一个同步的
WaitForExit
调用。无论如何,我认为输出流在流程开始时就可用,而不仅仅是在流程完成后。很高兴您解决了问题。这可能与Java中的Tekkit服务器有关
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);
  }
}