ProcessInfo and RedirectStandardOutput

前端 未结 6 1143
無奈伤痛
無奈伤痛 2020-11-27 16:54

I have an app which calls another process in a command window and that process has updating stats that output to the console window. I thought this was a fairly simple opera

6条回答
  •  南方客
    南方客 (楼主)
    2020-11-27 17:23

    I've experienced this before. Sometimes, the way in which the process you're calling outputs to the console is not compatible with this sort of output redirection. I've been fortunate enough in this case to be able to modify the external process to get around this.

    You might try running your code on another process that outputs to the console, and see if it works properly. It reads about right to me right now.

    EDIT:

    I went and pulled a code block I've used to do this. This is in a WPF app which redirects the process output to the window. Notice the event binding. Since this is WPF I have to invoke my call to write the data out. Since you aren't worried about blocking, ou should be able to simply replace that with:

    Console.WriteLine(e.Data);
    

    Hopefully it helps!

        private static void LaunchProcess()
        {
            Process build = new Process();
            build.StartInfo.WorkingDirectory =  @"dir";
            build.StartInfo.Arguments = "";
            build.StartInfo.FileName = "my.exe";
    
            build.StartInfo.UseShellExecute = false;
            build.StartInfo.RedirectStandardOutput = true;
            build.StartInfo.RedirectStandardError = true;
            build.StartInfo.CreateNoWindow = true;
            build.ErrorDataReceived += build_ErrorDataReceived;
            build.OutputDataReceived += build_ErrorDataReceived;
            build.EnableRaisingEvents = true;
            build.Start();
            build.BeginOutputReadLine();
            build.BeginErrorReadLine();
            build.WaitForExit();
        }
    
        // write out info to the display window
        static void build_ErrorDataReceived(object sender, DataReceivedEventArgs e)
        {
            string strMessage = e.Data;
            if (richTextBox != null && !String.Empty(strMessage))
            {
                App.Instance.Dispatcher.BeginInvoke(DispatcherPriority.Send, (ThreadStart)delegate()
                {
                    Paragraph para = new Paragraph(new Run(strMessage));
                    para.Margin = new Thickness(0);
                    para.Background = brushErrorBrush;
                    box.Document.Blocks.Add(para);
                });
           }
        } 
    

提交回复
热议问题