启动控制台应用程序并异步读取输出

时间:2015-07-30 22:02:27

标签: c# asynchronous process console stdout

我正在尝试通过C#应用程序启动游戏服务器(Game:Ark Survival Evolved)。 (某种包装)。

此游戏服务器是一个控制台应用程序,其中包含有关服务器当前状态的一些输出。 我想读取输出以便对它作出反应。这就是读取必须异步发生的原因。 (我不能等到服务器停止了)

我目前的做法如下:

        public void RunServer()
        {

            if (Process.GetProcessesByName("ShooterGameServer").Length <= 0)
            {
                Process p = new Process();
                // redirect output stream
                p.StartInfo.UseShellExecute = false;
                p.StartInfo.RedirectStandardOutput = true;
                p.EnableRaisingEvents = true;
                p.OutputDataReceived += (sender, args) => Display(args.Data);


                // set Server.exe path
                p.StartInfo.FileName = path_server;  

                // run server
                p.Start();

                // reading the console
                p.BeginOutputReadLine();
                p.WaitForExit(); // I've tried it without this line but it doesn't really help
            }
        }

        // Show the console output
        void Display(string output)
        {
            Console.Out.WriteLine(output);
        }

服务器exe启动完全正常,但只要StdOut出现就停止写入控制台。 (在控制台窗口中仍显示StdOut消息之前有一些StdErr消息。)

这是可以理解的,因为我只在我的代码中启用了p.StartInfo.RedirectStandardOutput = true,所以StdErr通道不受它的影响。

问题是重定向的输出永远不会出现在显示功能中。它只是消失在空气中。

如果我在Display功能中设置了一个断点,它就永远不会被调用,直到我关闭server.exe。之后调用它,但参数为null。

不幸的是,我对游戏服务器exe没有任何进一步的了解。 我错过了什么?

编辑:结果是重定向其他exe文件的输出(例如cmd exe)工作得很好。有没有其他方法可以在我的C#应用​​程序中读取控制台?也许只是“复制”输出而不是完全重定向?

0 个答案:

没有答案