ここにコードのスニペットがあります。私は長時間実行されているプロセスをシミュレートするので、どのキーストロークもキューに入れられます。 Console.Available
は、true
とfalse
を、ドキュメントに示すとおりに返します。すべてがここで素晴らしい作品:プロセスの起動時にConsole.KeyAvailableが失敗する
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 ***");
}
ここで問題です:私は本当のProcess
を作成して実行するコードでThread.Sleep()
を代用すると、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;
}