C#在循环中读取控制台应用程序
我需要为循环中的许多文件执行我的控制台应用程序并更新我的GUI。当我第一次执行我的应用程序时,一切正常,GUI更新实时完成。但是随着每一次迭代,控制台输出的读取会得到更长的延迟。 3-4文件后,我只得到几个更新或根本没有更新。它不是更新GUI的问题,我的dataraceivedevent不会启动。C#在循环中读取控制台应用程序
我不明白为什么,因为在每次迭代之后,我都会关闭并处理我的过程。
这是我在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);
}
执行100K次后,我有同样的问题,最后一次myProcess.WaitForExit();
花了这么多时间。相反,您可以使用另一个重载,它使用一个整数来指示进程有多少毫秒退出。 myProcess.WaitForExit(1000);
请拨打后.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();
杀死我的过程没有任何区别。 – user1755589
我更新了答案。请尝试并让我们知道 – Ozgur
问题有时候我需要等待一小时,有时候只需几分钟。常数值对我来说不是一个解决方案。 – user1755589
您可能想要查看此链接:http://msdn.microsoft.com/zh-cn/library/system.diagnostics.process.standarderror.aspx “该代码示例通过调用p.StandardError来避免死锁情况。在p.WaitForExit之前的ReadToEnd如果父进程在p.StandardError.ReadToEnd之前调用p.WaitForExit并且子进程写入足够的文本来填充重定向的流,则可能会导致死锁情况。父进程将无限期地等待子进程退出。子进程将无限期地等待父进程从完整的StandardError流中读取。“ – manman