1

ループ内の多くのファイルに対してコンソールアプリを実行し、GUIを更新する必要があります。初めてアプリを実行すると、すべて問題なく、GUIの更新がリアルタイムで行われます。ただし、反復するたびに、コンソール出力の読み取りの遅延が長くなります。3〜4個のファイルを使用した後、更新がほとんどないか、まったく更新されていません。GUIの更新に問題はなく、dataraceivedeventが起動しません。

繰り返しごとにプロセスを閉じて破棄するため、理由がわかりません。

これは、forループで実行するメソッドです。

public void execute(string arguments, string path)
    {
        Process myProcess = new Process();
        myProcess.StartInfo.CreateNoWindow = true;
        myProcess.StartInfo.FileName = path;
        myProcess.StartInfo.UseShellExecute = false;
        myProcess.StartInfo.RedirectStandardOutput = true;
        myProcess.StartInfo.Arguments = arguments;
        myProcess.Start();
        myProcess.BeginOutputReadLine();
        myProcess.OutputDataReceived += new DataReceivedEventHandler(this.updateProgress);
        myProcess.WaitForExit();
        myProcess.CancelOutputRead();
        myProcess.OutputDataReceived -= updateProgress;
        myProcess.Close();
        myProcess.Dispose();

        if (progressBar1.InvokeRequired)
        {
            progressBar1.BeginInvoke(new Action(() =>
            {
                progressBar1.PerformStep();
            }));
        }
        else
        {
            progressBar1.PerformStep();
        }

        if (progressBar2.InvokeRequired)
        {
            progressBar2.BeginInvoke(new Action(() =>
            {
                progressBar2.Value = 100;
                progressBar2.Refresh();
            }));
        }
        else
        {
            progressBar2.Value = 100;
            progressBar2.Refresh();
        }

        if (this.InvokeRequired)
        {
            this.BeginInvoke(new Action(() =>
            {
                this.Text = " ";
            }));
        }
        else
        {
            this.Text = " ";
        }
        Thread.Sleep(500);

    }
4

2 に答える 2

0

.BeginOutputReadLine();後にメソッドを呼び出してください.OutputDataReceived += new DataReceivedEventHandler(...);

OutputDataReceived読み始める前(イベントを添付する前)にイベントが発生している可能性があります

http://msdn.microsoft.com/en-us/library/system.diagnostics.process.beginoutputreadline.aspx

お気に入り:

    myProcess.OutputDataReceived += new DataReceivedEventHandler(this.updateProgress);
    myProcess.BeginOutputReadLine();
于 2012-10-18T08:27:50.113 に答える
0

10万回実行した後も同じ問題が発生しましたが、前回myProcess.WaitForExit();は非常に時間がかかりました。代わりに、プロセスが終了するまでのミリ秒数を示す整数をとる他のオーバーロードを使用できます。 myProcess.WaitForExit(1000);

于 2012-10-18T08:56:42.737 に答える