当前位置:编程学习 > C#/ASP.NET >>

读取cmd返回的数据特别慢,为什么?

现有c#写的winform程序,使用cmd命令调用exe程序,并获取exe程序返回的数据(量比较大)。
程序段如下:
string commandLine = @"c:\windows\system32\cmd.exe";
string arguments = "va.exe ";
Process process = new Process();
process.StartInfo.FileName = commandLine;
process.StartInfo.Arguments = " /c " + arguments;
process.StartInfo.CreateNoWindow = true;
process.StartInfo.UseShellExecute = false; 
process.StartInfo.RedirectStandardInput = true;
process.StartInfo.RedirectStandardOutput = true;
process.Start();
string s = process.StandardOutput.ReadLine();

va.exe(c++实现)仅用于测试,返回结果:
int main(int argc, char* argv[])
{
for (int i=0; i<7000; i++)
{
Sleep(100);    // (*)
cout << "a b c d e f g h i j " << i << " " << i*10 << endl;
}
return 0;
}
c#程序string s = process.StandardOutput.ReadLine();会经过数十秒的时间才能执行到。如果将Sleep(100)改为Sleep(1)的话,string s = process.StandardOutput.ReadLine();则1s就能执行到。现在要实现Sleep(100)的情况下也能够快速获取到数据,如何处理?
我怀疑是因为管道之间的缓冲区,但是没有找到解决的方法。 --------------------编程问答-------------------- 先延迟再获取数据,肯定会经过数十秒。先获取数据,再执行延迟操作 --------------------编程问答-------------------- 我分析原因如下:
    c#调用cmd命令执行va.exe并且希望读取数据的时候,va.exe一直向管道中写入数据,但是c#程序一直没有读取数据的机会。Sleep(100)时一直等待,直到缓冲区满,va.exe阻塞,c#才开始读取数据;而Sleep(1)的时候,缓冲区满的速度比较快,所以c#读取数据开始的就比较快。
    但我现在想实现va.exe写数据的同时,c#可以读取数据,如何实现? --------------------编程问答-------------------- 每次延迟0.1秒,7000次 --------------------编程问答-------------------- ReadChar试试 --------------------编程问答-------------------- 关注! --------------------编程问答-------------------- C++这端可调么?

如果可以,使用匿名管道的通讯方式可以解决。 它的前提是两个进程在同一机器,并且是父子进程。

可以msdn查一下。实现比较简单。 --------------------编程问答-------------------- 7000次,每次延迟0.1秒,肯定好几十秒了。。 --------------------编程问答-------------------- SLEEP在循环体中,要不需要数十秒就不正常了(7000*0.1) --------------------编程问答-------------------- 在我的印象中,Sleep(1)有较特殊的含义,一般的Sleep低于40ms(准确是35?不太确定)CLR是不响应的,而Sleep(1)相当于挂起当前线程,给其他线程让路,在线程循环中常用。 --------------------编程问答-------------------- 是7000个Sleep(100) =700秒的问题
进程.StandardOutput.ReadLine就是流输出的每行字符串
--------------------编程问答-------------------- 而且你不用调用cmd.exe --------------------编程问答-------------------- string commandLine = @"c:\windows\system32\cmd.exe"; 
string arguments = "va.exe "; 

改为

string commandLine = @"va.exe"; 
string arguments = "";

即不通过cmd调用,会得到我想要的效果。但是,通过cmd调用,我可以在参数行使用管道对va.exe的结果进一步处理,现在只能在c#进行处理了。
--------------------编程问答-------------------- 已经解决,arguments可以使用参数以及管道。 --------------------编程问答-------------------- 感觉楼主发这个帖子有点多余了,解决问题还是靠自己 --------------------编程问答-------------------- 我觉的sleep太多了
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,