Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ReadLine()使用c挂起应用程序#_C#_Asp.net - Fatal编程技术网

C# ReadLine()使用c挂起应用程序#

C# ReadLine()使用c挂起应用程序#,c#,asp.net,C#,Asp.net,下面是应用程序代码。有时p.StandardOutput.ReadLine();工作正常,但有一段时间它挂了我尝试了所有的东西,但仍然得到这个错误 ProcessStartInfo startInfo = new ProcessStartInfo("c:\\windows\\system32\\test.exe"); String s = " "; startInfo.WindowStyle = ProcessWindowStyle.Hidden; startInfo.CreateNo

下面是应用程序代码。有时p.StandardOutput.ReadLine();工作正常,但有一段时间它挂了我尝试了所有的东西,但仍然得到这个错误

 ProcessStartInfo startInfo = new ProcessStartInfo("c:\\windows\\system32\\test.exe");
 String s = " ";

 startInfo.WindowStyle = ProcessWindowStyle.Hidden;
 startInfo.CreateNoWindow = true;
 startInfo.RedirectStandardInput = true;
 startInfo.RedirectStandardOutput = true;
 startInfo.UseShellExecute = false;
 Process p = Process.Start(startInfo);
 p.StandardInput.WriteLine("list volume\n");
 String f = "";
 bool ignoredHeader = false;

 s = p.StandardOutput.ReadLine();
 p.WaitForExit();

请帮助我

如果被调用的程序总是只输出一行,并且该行比系统使用的缓冲区短,那么您的程序是正确的

如果它没有输出一行,
ReadLine
将不会返回。在这种情况下,你的程序被破坏了

如果输出太多,输出缓冲区将满,被调用的程序将阻塞其
Write
调用,直到有人从输出中读取足够的内容。由于您从未从输出缓冲区读取超过第一行的内容,因此该块将永远持续,因此被调用的程序将永远不会终止。这反过来会导致程序在
p.WaitForExit()
处死锁

报告明确指出:

在读取到其重定向流的末尾之前,不要等待子进程退出

代码示例通过在
p.WaitForExit
之前调用
p.StandardOutput.ReadToEnd
来避免死锁情况。如果父进程在
p.StandardOutput.ReadToEnd
之前调用
p.WaitForExit
,并且子进程写入足够的文本以填充重定向流,则可能导致死锁情况。父进程将无限期地等待子进程退出。子进程将无限期地等待父进程从完整的
StandardOutput
流中读取


也许程序有时不输出任何东西?或者有时输出多行?在这种情况下,一旦输出缓冲区已满,被调用的程序将阻塞。而且,由于您从未在第一行之后读取它,它将永远阻塞,因此
WaitForExit()
不会返回。简而言之,您的程序是错误的,除非被调用的程序总是只输出一行,不多也不少。或者有时程序写入标准错误而不是标准输出?例如,当它检测到某个地方出了问题时?@Arion它只是挂起application@CodeInChaos不,它没有任何输出