启动流程时,Console.KeyAvailable失败

时间:2016-10-20 22:25:33

标签: c# .net console-application system.diagnostics

这是一段代码,工作得很好。当我模拟一个长时间运行的进程时,任何击键排队。 Console.Available会返回truefalse,就像文档中指出的那样。一切都很好:

while (true) {
   Console.WriteLine("Starting long task...");
   // Simulate some long task by sleeping 3 seconds
   System.Threading.Thread.Sleep(3000);
   Console.WriteLine("Long task is finished.");

   if (Console.KeyAvailable) 
      Console.WriteLine("A key is available: " + Console.ReadKey(false).Key);
   else
      Console.WriteLine("*** No Key available ***");
}

问题在于:当我使用代码替换Thread.Sleep()来创建并运行真实的Process时,Console.KeyAvailable将停止工作。 Console.KeyAvailable行为不正常,通常会返回false,但如果我输入足够快的密钥,有时会返回true

有人对此有解释吗?

while (true) {
   LongRunningProcess("someFile.bin");

   if (Console.KeyAvailable) 
      Console.WriteLine("A key is available: " + Console.ReadKey(false).Key);
   else
      Console.WriteLine("*** No Key available ***");
}

private static bool LongRunningProcess(String filename) {
   ProcessStartInfo processStartInfo = new ProcessStartInfo("BlahBlahBlah.exe", filename);
   processStartInfo.UseShellExecute = false;
   processStartInfo.RedirectStandardError = true;

   Process p = new Process();
   p.StartInfo = processStartInfo;
   p.Start();

   StreamReader stdError = p.StandardError;

   int readResult = stdError.Read();

   p.Close();

   if (readResult != -1) // error was written to std error
      return false;

   return true;
} 

1 个答案:

答案 0 :(得分:1)

启动的进程显示一个窗口,该窗口成为活动窗口。您的控制台应用程序仅在您的控制台窗口是活动窗口时接收键盘输入。尝试将cout << (y % 8);的{​​{1}}属性设置为true。