2010-10-14 107 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....  
    } 
    } 
}