2016-10-20 10 views
1

ここにコードのスニペットがあります。私は長時間実行されているプロセスをシミュレートするので、どのキーストロークもキューに入れられます。 Console.Availableは、truefalseを、ドキュメントに示すとおりに返します。すべてがここで素晴らしい作品:プロセスの起動時に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; 
} 

答えて

1

開始されたプロセスには、アクティブなウィンドウになるウィンドウが表示されます。あなたのコンソールアプリケーションは、コンソールウィンドウがアクティブなウィンドウである間だけキーボード入力を受け取ります。 ProcessStartInfoCreateNoWindowプロパティをtrueに設定してみてください。

関連する問題