Получить вывод команды CMD в реальном времени в приложении C # - PullRequest
0 голосов
/ 30 декабря 2018

Я хочу создать настольное приложение, такое как командная строка.в этом приложении я получаю ввод из текстового поля и помещаю вывод в режиме реального времени в rich-textbox.

, но некоторые команды должны ждать полного выполнения, например, «установка композитора» (что приведет к загрузке необходимых ресурсов,почему это занимает много времени, а также отображает состояние процесса загрузки в процентах)

Поэтому мой главный вопрос - как я могу сделать что-то вроде командной строки, которая может дать динамический вывод с небольшим весом без зависаний, если какой-либо другой язык вместоc # может сделать это, а затем предложить мне.

мое настольное приложение выглядит следующим образом.

enter image description here

и c # «Run» кнопка при нажатииМетод события следующий:

private void button1_Click(object sender, EventArgs e)
{
    richTextBox1.Text = "";
    if (textBox1.Text != null)
    {

        ProcessStartInfo info = new ProcessStartInfo("cmd", "/c " + textBox1.Text);

        info.UseShellExecute = false;
        info.RedirectStandardInput = true;
        info.RedirectStandardOutput = true;
        info.RedirectStandardError = true;
        info.CreateNoWindow = true;

        StringBuilder outputBuilder = new StringBuilder();
        StringBuilder errorBuilder = new StringBuilder();

        Process process = new Process();
        process.StartInfo = info;
        process.OutputDataReceived += new DataReceivedEventHandler(SortOutputHandler);
        process.ErrorDataReceived += new DataReceivedEventHandler(SortOutputHandler);

        process.Start();
        process.BeginErrorReadLine(); // do this after process.Start()
        process.BeginOutputReadLine();

        process.WaitForExit();
    }
}

private void SortOutputHandler(object sendingProcess,DataReceivedEventArgs outLine)
{
    StringBuilder sortOutput = new StringBuilder("");
    if (richTextBox1.InvokeRequired) { richTextBox1.BeginInvoke(new DataReceivedEventHandler(SortOutputHandler), new[] { sendingProcess, outLine }); }
    else
    {
        sortOutput.Append(Environment.NewLine + outLine.Data);
        richTextBox1.AppendText(sortOutput.ToString());
        richTextBox1.ScrollToCaret();
    }
}

мой код полностью работает, но приложение зависает до тех пор, пока команда не будет выполнена полностью, пока выполняются динамические команды, такие как "composer install"

...