2013-04-24 5 views
1

Вот пример из одного C# книги:Бесконечные в то время как петля

// Timer02.cs - Displaying Date and Time 
//  Using the Timer class. 
//  Press Ctrl+C or 'q' folllwed by Enter to end program. 
//------------------------------------------------------------ 
using System; 
using System.Timers; 

class myApp 
{ 
    public static void Main() 
    { 
     Timer myTimer = new Timer(); 
     myTimer.Elapsed += new ElapsedEventHandler(DisplayTimeEvent); 
     myTimer.Interval = 1000; 
     myTimer.Start(); 


     while (Console.Read() != 'q') 
     { 
      ; // do nothing... 
     } 
    } 

    public static void DisplayTimeEvent(object source, ElapsedEventArgs e) 
    { 
     Console.Write("\r{0}", DateTime.Now); 
    } 
} 

Я думаю, что это, как предполагается, что петли пробегов до д не будет нажат, но при д нажатием цикла не заканчивается.

Что мне здесь не хватает?

+1

Заполните Ввод в конец программы. –

+0

Вы можете добавить ввод, чтобы закончить его, или использовать мой пример ниже, чтобы использовать его только с ключом q. –

ответ

4

Я подозреваю, что вы не нажимали возврат после q. Метод Console.Read блокируется до тех пор, пока не будет прочитана целая строка, хотя на самом деле она читает только один символ этой строки.

Из документации:

Прочитанного метод блокирует его возврат при вводе входных символов; он завершается, когда вы нажимаете клавишу Enter.

+0

Очень просто, но верно, так как я нажал ENTER после того, как q сделал то, что он должен был делать, - закончить цикл. Благодарю. –

1

EDIT: метод, который я опубликовал, никогда не печатал сообщение, пока не нажал какой-либо другой ключ.

Это будет работать, однако ....

public static void Main() 
    { 
     Timer myTimer = new Timer(); 
     myTimer.Elapsed += new ElapsedEventHandler(DisplayTimeEvent); 
     myTimer.Interval = 1000; 
     myTimer.Start(); 

     while (true) 
     { 
      if (Console.KeyAvailable) 
      { 
       while (Console.ReadKey().KeyChar != 'q') 
       { 
        // do nothing 
       } 
       break; 
      } 
     } 
    } 

Ключевым моментом здесь является использование:.! Console.ReadKey() KeyChar = 'д'

+1

Это совершенно необязательно и не имеет отношения к вопросу. –

+0

Исправлено ... Извините. На самом деле это не имеет значения, если таймер блокирует его, он никогда не выйдет. –

+0

Спасибо за предоставление альтернативного решения. –

Смежные вопросы