2010-10-14 57 views
6


我知道我可以使用ReadKey,但它會凍結應用程序,直到用戶按下一個鍵。是否有可能(在控制檯應用程序)有一些循環運行,仍然能夠作出反應?我只能想到事件,但不知道如何在控制檯中使用它們。 我的想法是循環會在每次迭代期間檢查輸入。c#讀取用戶輸入而不停止應用程序

+0

當然,您希望應用程序處於準備好接受用戶輸入的狀態,所以在按鍵時您可以執行一些功能。或者,這就像一個按鈕取消處理? – jimplode 2010-10-14 08:18:42

+0

是的,但很好的例子是一個遊戲 - 你需要運行一些循環(敵人的運動,不管),但仍然註冊播放器輸入 – Ptr 2010-10-14 08:22:47

回答

7

他們的方式我這樣做對我自己的應用程序是有一個專門的線程調用到System.Console.ReadKey(true)並提出按鍵(以及任何其他事件)到消息隊列。

然後,主線程在一個循環中(以類似於Win32應用程序中的主循環的方式)服務此隊列,確保呈現和事件處理全部在單個線程上處理。

private void StartKeyboardListener() 
{ 
    var thread = new Thread(() => { 
             while (!this.stopping) 
             { 
              ConsoleKeyInfo key = System.Console.ReadKey(true); 
              this.messageQueue.Enqueue(new KeyboardMessage(key)); 
             } 
            }); 

    thread.IsBackground = true; 
    thread.Start(); 
} 

private void MessageLoop() 
{ 
    while (!this.stopping) 
    { 
     Message message = this.messageQueue.Dequeue(DEQUEUE_TIMEOUT); 

     if (message != null) 
     { 
      switch (message.MessageType) 
      { 
       case MessageType.Keyboard: 
        HandleKeyboardMessage((KeyboardMessage) message); 
        break; 
       ... 
      } 
     } 

     Thread.Yield(); // or Thread.Sleep(0) 
    } 
} 
+0

嗯,我看到了,所以我想不是那麼簡單的方法。謝謝 – Ptr 2010-10-14 08:20:04

1

讓循環運行在單獨的線程中。

class Program 
{ 
    private static string input; 

    public static void Main() 
    { 
    Thread t = new Thread(new ThreadStart(work)); 
    input = Console.ReadLine(); 

    } 

    private static void work() 
    { 
    while (input == null) 
    { 
     //do stuff....  
    } 
    } 
}