C#在循环中读取控制台应用程序

时间:2012-10-18 08:21:39

标签: c#

我需要在循环中为许多文件执行我的控制台应用程序并更新我的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);

    }

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分:0)

执行100K次后我遇到了同样的问题,myProcess.WaitForExit();上次花了这么多时间。相反,您可以使用另一个重载,该重载采用一个整数来指示进程有多少毫秒退出。 myProcess.WaitForExit(1000);