2011-01-27 11 views
3

Console.ReadLineとタイマーの使い方を理解しようとしています。私のコンソールプログラムは、長いプロセスを自動的に実行するように設計されています。このプロセスは、前のプロセスが完了してから30秒ごとに再起動します。私はコマンドを入力して自動実行を中断する機能をユーザーに与えたい。しかし、Console.ReadLine()を使用すると、ユーザーが何かを入力するまで待機しますが、30秒以内に何も入力されなければ、ループを介してプログラムを続行します。 。 。何かご意見は??例えばConsole.ReadLine Break

RunProcess>ユーザー入力のための30代を待ちます。一致しない場合:Continue Loop

ありがとうございます!

+0

のが重複する可能性を試してみてください[Console.ReadLine(にタイムアウトを追加する方法)?](http://stackoverflow.com/questions/57615/how-to-add-コンソールからのreadlineへのタイムアウト) –

+0

http://stackoverflow.com/questions/57615/how-to-add-a-timeout-to-console-readline –

答えて

3

別のスレッドでタイマーを実行できます。ユーザーがテキストを入力すると、両方のスレッドがアクセス可能な変数に格納します。タイマーが立ち上がると、何かが入力されているかどうかを確認し、それに応じて続行します。

あなたは30秒ごとにチェックを入れ、そのコールバックメソッドでは、テキストが設定されているかどうかを確認するためにSystem.Threading.Timerを使用することができます。

EDIT :-)、スレッドセーフであるようにしてください。

+0

これを行う方法についてのご意見はありますか?バックグラウンドワーカーを超えて明示的にスレッドなどを開始することで、実際にはあまりやっていません。私はバックグラウンドワーカーだと思っていましたが、タイマーを使用できるかどうかは分かりません.... – keynesiancross

1

Console.ReadLine()を使用しないでください。Console.KeyAvailableが真であることを確認してから、終了条件を確認するためにConsole.ReadKey()を読んでください。

この例のコード

class Program 
{ 
    static bool done; 
    static void Main(string[] args) 
    { 
     int count = 0;    
     done = false; 
     while (!done) 
     { 
      Thread.Sleep(2000); 
      count++; 
      Console.WriteLine("Calculation #" + count.ToString()); 
      if (Console.KeyAvailable) 
      { 
       ConsoleKeyInfo key = Console.ReadKey(); 
       if (key.Key == ConsoleKey.Escape) 
       { 
        done = true; 
       } 
      }         
     } 
     Console.WriteLine(); 
     Console.WriteLine("end"); 
    } 
}