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