C# 新进程不再捕获输出

C# 新进程不再捕获输出,c#,winforms,process,minecraft,C#,Winforms,Process,Minecraft,我曾经有过这样的工作,我将它与我的旧代码进行了比较,但我不知道最近我在哪里对此进行了任何更改。我现在不知所措 我正在尝试运行Minecraft服务器。我希望输出显示在我的richtextbox中。就像我说的,这很好用 无论如何,下面是代码: public void RunMinecraftsServer() { try { if (_serverProc != null) {

我曾经有过这样的工作,我将它与我的旧代码进行了比较,但我不知道最近我在哪里对此进行了任何更改。我现在不知所措

我正在尝试运行Minecraft服务器。我希望输出显示在我的richtextbox中。就像我说的,这很好用

无论如何,下面是代码:

   public void RunMinecraftsServer()
    {
        try
        {
            if (_serverProc != null)
            {
                MessageBox.Show("The server is already running.");
                return;
            }

            if (string.IsNullOrWhiteSpace(textBox_JarFile.Text) ||
                !File.Exists(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, textBox_JarFile.Text)))
            {
                MessageBox.Show(
                    "Jar file does not exists. Please select a jar file for the server to run and start again.");
                return;
            }

            var serverparms = string.Format("-Xms{0}M -Xmx{1}M -jar {2} nogui -nojline",
                numericUpDown_Xms.Text, numericUpDown_Xmx.Text, _settings.CurrentSettings.JarFileName);
            var startInfo = new ProcessStartInfo(_settings.CurrentSettings.JavaPathAndExe, serverparms)
            {
                WorkingDirectory = AppDomain.CurrentDomain.BaseDirectory
            };
          startInfo.RedirectStandardInput = true;
          startInfo.RedirectStandardOutput = true;
              startInfo.RedirectStandardError = true;
            startInfo.UseShellExecute = false;
            startInfo.CreateNoWindow = true;

            // create process
            _serverProc = new Process();
            _serverProc.StartInfo = startInfo;
            _serverProc.EnableRaisingEvents = true;
            // bind events
            _serverProc.ErrorDataReceived += ServerProcErrorDataReceived;
            _serverProc.OutputDataReceived += ServerProcOutputDataReceived;
            _serverProc.Exited += ServerProcExited;
            // start the process and monitor
            _serverProc.Start();
            _serverProc.BeginErrorReadLine();
            textBox_SubmitCommand.KeyDown += TextBoxSubmitCommandKeyDown;
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error: " + ex.Message);
            Logging.LogException(ex);
        }
    }
我在这里捕捉到它,或者至少应该是:

    private void ServerProcOutputDataReceived(object sender, DataReceivedEventArgs e)
    {
        if (richTextBox_Console.InvokeRequired)
        {
            richTextBox_Console.Invoke((MethodInvoker) (() => ServerProcErrorDataReceived(sender, e)));
        }
        else
        {
            richTextBox_Console.Text += e.Data + Environment.NewLine;
            richTextBox_Console.SelectionStart = richTextBox_Console.Text.Length;
            richTextBox_Console.ScrollToCaret();
            ParseServerInput(e.Data);
            ParseServerInput(e.Data);
        }
    }
我在这个方法上设置了一个断点,但它从未到达

有人知道我做错了什么吗

编辑#3

我解决了引起我注意的编码问题

我改变了:

startInfo.RedirectStandardInput = startInfo.RedirectStandardError = true;
致:


但是仍然没有输出:(

尝试添加代码以等待进程结束,然后再离开RunMinecraftsServer方法。类似如下:

public void RunMinecraftsServer()
{
    try
    {
        ...

         var dtEndTime = DateTime.Now.AddMinutes( 1 );
         while ( !serverProc.HasExited && ( DateTime.Now < dtEndTime ) )
         {
              System.Threading.Thread.Sleep( TimeSpan.FromMilliseconds( 500 ) );
              serverProc.Refresh();
        }
    }
    catch ( Exception ex )
    {
       ...
    }
}
public void RunMinecraftsServer()
{
尝试
{
...
var dtEndTime=DateTime.Now.AddMinutes(1);
当(!serverProc.hasExit&(DateTime.Now

您可以尝试的另一件事是确保MincraftServer在输出结束之前正在向输出写入回车符和换行符。信不信由你,我见过这样的情况:如果孩子没有向输出写入CR/LF,监控应用程序将无法获取孩子的输出。

您正在调用
\u serverProc.BeginErrorReadLine();
因此您将从stderr读取,但您忘记调用
\u serverProc.BeginOutputReadLine();
,因此您将永远不会从stdout读取任何内容,也永远不会到达您当前调用的
ServerProcOutputDataReceived

// start the process and monitor
_serverProc.Start();
_serverProc.BeginErrorReadLine();
textBox_SubmitCommand.KeyDown += TextBoxSubmitCommandKeyDown;
不打电话:

_serverProc.BeginOutputReadLine();

这意味着永远不会调用ServerProcOutputDataReceived然后它应该会工作!

我不确定我是否理解。只要服务器在运行,serverProc就会一直运行。在我向服务器发送“停止”命令之前,我不会离开该循环。你能详细说明你要完成什么吗?你忘了将RedirectStandardOutput设置为true。ServerProcOutput中的else子句中的代码DataReceived()方法将永远不会运行。@HansPassant很抱歉弄错了,我急于解决这个问题。我已经添加了上面的3行,没有解决。
_serverProc.BeginOutputReadLine();