Поток процесса C # не может записать вывод - PullRequest
1 голос
/ 21 мая 2019

Пустое (без текста) окно консоли видно, как только я запускаю процесс, но, похоже, оно не отправляет команды.

Вот как я определяю свой процесс:

        void Init()
        {
            ProcessStartInfo psi = new ProcessStartInfo();
            psi.FileName = "CMD.exe";
            // psi.FileName = @"cmd.exe";
            // psi.Arguments = @"'/K' C:\Dev\Anaconda3\Scripts\activate.bat C:\Dev\Anaconda3";
            psi.RedirectStandardInput = true;
            psi.RedirectStandardOutput = true;
            psi.RedirectStandardError = true;
            // psi.WorkingDirectory = @"C:\temp";
            psi.UseShellExecute = false;
            // psi.CreateNoWindow = true;
            // psi.WindowStyle = ProcessWindowStyle.Hidden;
            process = Process.Start( psi );

            process.ErrorDataReceived += ( sender, e ) => 
            { 
                if( ErrorDataReceived != null )
                {
                    ErrorDataReceived.Invoke( e.Data );
                }
            };
            process.OutputDataReceived += ( sender, e ) => 
            { 
                if( OutputDataReceived != null )
                {
                    OutputDataReceived.Invoke( e.Data );
                }
            };
        }

Начало потока

        Thread thread;
        Process process;
        public void Start()
        {
            Init();
            thread = new Thread(ThreadMain);
            thread.Start(); 
        }

Зарегистрировать внешние команды для выполнения

        string command;
        bool command_complete = true;
        public void Exec( string command )
        {
            if( ! command_complete ) return;
            this.command = command;
            command_complete = string.IsNullOrWhiteSpace( command );
        }

Мои события:

        public event Action<string> ErrorDataReceived;
        public event Action<string> OutputDataReceived;
        public event Action<string> InputDataReceived;

Ее я вижу, что InputDataReceived вызывается извне, но никогда не OutputDataReceived

        void ThreadMain()
        {
            while( true )
            {
                if( exit ) break;

                if( ! command_complete )
                {
                    process.StandardInput.WriteLine( command );

                    if( InputDataReceived != null )
                    {
                        InputDataReceived.Invoke( command );
                    }

                    command_complete = true;
                }

                Thread.Sleep( 250 );
            }

            Dispose();
        }

Ответы [ 2 ]

1 голос
/ 21 мая 2019

Попробуйте это

if (!command_complete)
   {
       using (StreamWriter si = process.StandardInput)
       {
           si.WriteLine(command);
       }
       ...
   }
1 голос
/ 21 мая 2019

Только что посмотрел на это сообщение , похоже, я забыл начать мониторинг ввода

        void ThreadMain()
        {
            process.BeginOutputReadLine();
            process.BeginErrorReadLine();

            while( true ) 
            { 
                // ...

                Thread.Sleep( 250 ); 
            } 

            process.CancelOutputRead();
            process.CancelErrorRead();

            Dispose();
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...