コマンドプロンプトを同時に開き、出力をテキストボックスに表示する

私はこれまでにcmdと非同期的に出力の読み込みを開始しています(私は達成するための他の方法を想像できませんでした)。それはリアルタイム用です)。アプリケーションのコマンドは、cmdのプロセスが終了するのを待つのではなく、通常のように続行されるということです。つまり、cmdboxが操作を完了する前にメッセージボックスがポップアップします。すべての答えをありがとう:)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Forms;
using System.IO;
using System.Diagnostics;
using System.Threading;

namespace WindowsFormsApplication3
{
    public partial class Form1 : Form
    {
        public bool progressbool = false;
        public string strOutput;
        public string pathforit = Directory.GetCurrentDirectory();
        public string line;
        System.Diagnostics.Process pProcess = new System.Diagnostics.Process();

    public Form1()
    {
        InitializeComponent();
        commandline();


    }

    private void Form1_Load(object sender, EventArgs e)
    {

    }

    public void commandline()
    {

        pProcess.StartInfo.FileName = "cmd.exe";
        pProcess.StartInfo.UseShellExecute = false;
        pProcess.StartInfo.RedirectStandardInput = true;
        pProcess.StartInfo.RedirectStandardOutput = true;
        pProcess.StartInfo.CreateNoWindow = true;
        pProcess.Exited += new EventHandler(myProcess_Exited);
        pProcess.OutputDataReceived += new System.Diagnostics.DataReceivedEventHandler(process_OutputDataReceived);
        pProcess.Start();
        pProcess.BeginOutputReadLine();
        pProcess.StandardInput.WriteLine("dir");


    }


    void process_OutputDataReceived(object sender, System.Diagnostics.DataReceivedEventArgs e)
    {
        this.AddText(e.Data);
    }
    delegate void AddTextCallback(string text);
    private void AddText(string text)
    {
        if (this.textBox1.InvokeRequired)
        {
            AddTextCallback d = new AddTextCallback(AddText);
            this.Invoke(d, new object[] { text });
        }
        else
        {
            this.textBox1.Text += text + Environment.NewLine;
            textBox1.SelectionStart = textBox1.Text.Length;
            textBox1.ScrollToCaret();
            textBox1.Refresh();
        }
    }
    private void myProcess_Exited(object sender, System.EventArgs e)
    {

        MessageBox.Show("The commands Operations have finished");
    }
}
1

2 答え

WaitForExit を呼び出すことでそれを行うことができます。
しかし、それをしないでください。待機中にプログラムがフリーズします。
UIスレッドでブロック操作を実行しないでください。

代わりに、 Exited イベントを処理し、そこにメッセージボックスを表示します。

2
追加された
@Stefanou: exit を実行しない限り、 cmd は決して終了しません。
追加された 著者 SLaks,
Directory.EnumerateFiles のように見えます。
追加された 著者 SLaks,
cmd/c ... が必要な場合があります。 ( dir とは異なり)実際のプログラムを実行している場合は、 cmd を使わずに直接実行できます。
追加された 著者 SLaks,
あなたが彼にしてはいけないことを示唆しています。 :)
追加された 著者 Nathan,
答えをありがとう、私は本当にそれを感謝します。上記のコードを編集して今の状態を表示します。問題は、私がそのプログラムを実行するとプロセスが終了せず、メッセージボックスが表示されないということです
追加された 著者 Stefanou,
どのような例もありませんでしたが、本当にありがとうございました。
追加された 著者 Stefanou,

プロセスのExitedイベントをフックし、メッセージボックスを

すなわち、

pProcess.Exited +=//my exit handler 
1
追加された