C # запускает стандартные процессы - PullRequest
0 голосов
/ 25 мая 2018

У меня есть приложение, которое запускает фоновый процесс, и мне нужно показать стандарт этого приложения во время выполнения, например, в режиме реального времени.Я попытался process.OutputDataReceived, но это сработало после завершения фонового процесса.Но мне нужно показать стандартный вывод при создании этого процесса.

К вашему сведению: я перенаправил стандартный вывод и установил UseShellExecute false

Вот полные изменения, которые я сделал впроцесс:

ProcessStartInfo t = new ProcessStartInfo();
t.CreateNoWindow = true;
t.FileName = name;
t.Arguments = args;
t.UseShellExecute = false;
t.CreateNoWindow = true;
t.RedirectStandardOutput = true;
t.RedirectStandardError = true;

Process p = new Process();
p.StartInfo = t;
p.OutputDataReceived += P_OutputDataReceived;
p.Start();
p.BeginOutputReadLine();

И мое событие:

private void P_OutputDataReceived(object sender, DataReceivedEventArgs e)
    {
        Textbox1.Text = e.Data;
    }

Также я попробовал это с файлом Python, его исполняемой версией и исполняемым файлом C, но результат тот жеиз них.

Редактировать: я пытался это решение, но снова получил тот же результат

** Обновление 04.06.2018: ** Я только что обнаружил, что P_OutputDataReceivedсобытие также инициируется, когда приложение ожидает стандартного ввода, но все еще не может найти способ вызвать это событие в режиме реального времени

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Мой первый ответ был неправильным и бесполезным.Извини за это.Это пример Windows Forms для вызова приложения (Robocopy.exe) нажатием кнопки и перенаправления вывода в TextBox на главной форме в режиме реального времени.

using System;
using System.Diagnostics;
using System.Windows.Forms;

namespace testApp
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            using (Process tProc = new Process())
            {
                ProcessStartInfo t = new ProcessStartInfo();
                t.CreateNoWindow = true;
                t.FileName = Environment.SystemDirectory + "\\robocopy.exe";
                t.Arguments = "/?";
                t.UseShellExecute = false;
                t.CreateNoWindow = true;
                t.RedirectStandardOutput = true;
                t.RedirectStandardError = true;

                Process p = new Process();
                p.StartInfo = t;
                p.OutputDataReceived += new DataReceivedEventHandler(P_OutputDataReceived);
                p.Start();
                p.BeginOutputReadLine();                  
            }
        }

        private void P_OutputDataReceived(object sender, DataReceivedEventArgs e)
        {
            try
            {
                Trace.WriteLine(e.Data);
                this.BeginInvoke(new MethodInvoker(() =>
                {
                    textBox1.AppendText(e.Data ?? string.Empty);
                }));
            }
            catch (System.Exception x)
            {
                MessageBox.Show(x.ToString());
            }
        }
    }
}
0 голосов
/ 25 мая 2018

Поскольку выполняемый процесс также является другим потоком, вам необходимо вернуться к потоку пользовательского интерфейса для отображения данных этого процесса.Это может быть достигнуто с помощью метода Invoke, как показано ниже:

private delegate void ShowDataDelegate(string data);

private void P_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
   ShowDataDelegate showDataDelegate = new ShowDataDelegate(ShowData);
   Invoke(showDataDelegate, e.Data);
}

private void ShowData(string data)
{
   textBox1.Text = data;
}
...