2013-04-24 89 views
1

這裏是例子從一個C#的書:永不落幕while循環

// 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); 
    } 
} 

我想,這應該直到按下q是循環運行,但是當按下Q鍵循環沒有結束。

我在這裏失蹤了什麼?

+1

然後按Enter鍵結束程序。 – 2013-04-24 16:55:59

+0

你可以添加回車來結束它,或者使用下面的例子來用q鍵來使用它。 – 2013-04-24 17:01:04

回答

4

我懷疑你沒有按回車鍵之後qConsole.Read方法會阻止,直到有整行讀取,即使它只讀取該行的單個字符。

從文檔:

Read方法阻斷其回報,而你輸入的輸入字符;當您按下Enter鍵時它會終止。

+0

非常簡單但真實的,因爲我按下ENTER後q它做了它應該做的 - 終止循環。謝謝。 – 2013-04-24 17:03:10

1

編輯:我發佈的方法從未打印消息,直到按下其他某個鍵。

然而,這會工作....

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 = 'Q'

+1

這完全沒有必要,而且與問題無關。 – 2013-04-24 16:56:28

+0

固定...對不起。雖然不是毫無意義,但如果計時器被阻止,它將永遠不會退出。 – 2013-04-24 16:59:08

+0

感謝您提供替代解決方案。 – 2013-04-24 17:04:49