Metoda WaitForExit() w klasie Proscess blokuje działaanie programu

Odpowiedz Nowy wątek
2019-11-07 14:20
0

Próbuję przechwycić wyjście standardowe aplikacji konsolowej. Wywołanie metody WaitForExit() blokuje działanie programu i nic się nie wyświetla w "richTextBox1". Jak usunę wywołanie tej metody to wtedy wszystko działa. Jednak zależy mi na użyciu WaitForExit();

private void button1_Click(object sender, EventArgs e)
{
    process1.StartInfo.FileName = "cmd.exe";
    process1.StartInfo.Arguments = "/?";

    process1.Start();
    process1.BeginOutputReadLine();
    process1.BeginErrorReadLine();

    process1.WaitForExit();
}

private void process1_OutputDataReceived(object sender, System.Diagnostics.DataReceivedEventArgs e)
{
    richTextBox1.Text += e.Data + "\n";
}

private void process1_ErrorDataReceived(object sender, System.Diagnostics.DataReceivedEventArgs e)
{
    richTextBox1.Text += e.Data + "\n";
}

Pozostało 580 znaków

2019-11-08 14:31
0

To jak chcesz wiedzieć kiedy proces zakończy działanie i ma nie blokować aktualnego wątku to w dokumentacji przy metodzie Process.WaitForExit jest: "To avoid blocking the current thread, use the Exited event.".

w Form1.Designer.cs dodajesz:

this.process1.EnableRaisingEvents = true;
this.process1.Exited += new EventHandler(this.process1_ProcessExitHandler);

a w Form1.cs

private void process1_ProcessExitHandler(object sender, EventArgs e)
{

}

Pozostało 580 znaków

30 minut temu
0

Dzięki Pablo8. Wykorzystanie zdarzenia "Exited" obeszło problem. Ale i tak nie rozumiem czemu poniższy kod działa w 100%, tzn.: Proces się kończy. W związku z czym "WaitForExit() też się kończy i nie blokuje niczego. Wyjście standardowe procesu zostaje skopiowane do richTextBox oraz wyświetla się "messageBox" generowany w zdarzeniu "Exited"

using System;
using System.Windows.Forms;

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

            process1.StartInfo.RedirectStandardError = true;
            process1.StartInfo.RedirectStandardOutput = true;
            process1.StartInfo.UseShellExecute = false;
            process1.StartInfo.FileName = "cmd.exe";
            process1.StartInfo.Arguments = "/?";

            test();
        }

        public void test()
        {
            process1.Start();

            process1.BeginOutputReadLine();
            process1.BeginErrorReadLine();

            process1.WaitForExit();
            process1.CancelOutputRead();
            process1.CancelErrorRead();
            process1.Close();
        }

        private void process1_OutputDataReceived(object sender, System.Diagnostics.DataReceivedEventArgs e)
        {
            if (string.IsNullOrEmpty(e.Data)) return;

            if (richTextBox1.InvokeRequired)
            {
                richTextBox1.Invoke((MethodInvoker)delegate { richTextBox1.Text += e.Data + "\n"; });
            }
            else
            {
                richTextBox1.Text += e.Data + "\n";
            }
        }

        private void process1_ErrorDataReceived(object sender, System.Diagnostics.DataReceivedEventArgs e)
        {
            if (string.IsNullOrEmpty(e.Data)) return;

            if (richTextBox1.InvokeRequired)
            {
                richTextBox1.Invoke((MethodInvoker)delegate { richTextBox1.Text += e.Data + "\n"; });
            }
            else
            {
                richTextBox1.Text += e.Data + "\n";
            }
        }

        private void process1_Exited(object sender, EventArgs e)
        {
            process1.CancelOutputRead();
            process1.CancelErrorRead();
            MessageBox.Show("Proces zakończył się");
        }
    }
}

Natomiast w poniższym kodzie proces nie kończy się, dlatego wykonanie programu zatrzymuje się na "WaitForExit()", i nawet formularz się nie wyświetla. Różnica między kodami jest taka, że w pierwszym przypadku wywołuję metodę "test()" w konstruktorze klasy "Form1", a w drugim w zdarzeniu "Load" formularza.

using System;
using System.Windows.Forms;

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

            process1.StartInfo.RedirectStandardError = true;
            process1.StartInfo.RedirectStandardOutput = true;
            process1.StartInfo.UseShellExecute = false;
            process1.StartInfo.FileName = "cmd.exe";
            process1.StartInfo.Arguments = "/?";
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            test();
        }

        public void test()
        {
            process1.Start();

            process1.BeginOutputReadLine();
            process1.BeginErrorReadLine();

            process1.WaitForExit();
            process1.CancelOutputRead();
            process1.CancelErrorRead();
            process1.Close();
        }

        private void process1_OutputDataReceived(object sender, System.Diagnostics.DataReceivedEventArgs e)
        {
            if (string.IsNullOrEmpty(e.Data)) return;

            if (richTextBox1.InvokeRequired)
            {
                richTextBox1.Invoke((MethodInvoker)delegate { richTextBox1.Text += e.Data + "\n"; });
            }
            else
            {
                richTextBox1.Text += e.Data + "\n";
            }
        }

        private void process1_ErrorDataReceived(object sender, System.Diagnostics.DataReceivedEventArgs e)
        {
            if (string.IsNullOrEmpty(e.Data)) return;

            if (richTextBox1.InvokeRequired)
            {
                richTextBox1.Invoke((MethodInvoker)delegate { richTextBox1.Text += e.Data + "\n"; });
            }
            else
            {
                richTextBox1.Text += e.Data + "\n";
            }
        }

        private void process1_Exited(object sender, EventArgs e)
        {
            process1.CancelOutputRead();
            process1.CancelErrorRead();
            MessageBox.Show("Proces zakończył się");
        }
    }
}

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

3 użytkowników online, w tym zalogowanych: 2, gości: 1, botów: 0

Użytkownik: Bednarus3, Pablo8