【问题标题】:c# reading user input without stopping an appc#在不停止应用程序的情况下读取用户输入
【发布时间】:2011-04-25 06:43:44
【问题描述】:


我知道我可以为此使用 ReadKey,但它会冻结应用程序,直到用户按下一个键。是否有可能(在控制台应用程序中)运行一些循环并且仍然能够做出反应?我只能想到事件,但不确定如何在控制台中使用它们。 我的想法是循环会在每次迭代期间检查输入。

【问题讨论】:

  • 当然您希望应用程序处于准备好接受用户输入的状态,因此在按键时您可以执行一些功能。或者这就像按下一个按钮来取消处理??
  • 是的,但很好的例子是游戏 - 你需要运行一些循环(敌人移动,无论如何),但仍然注册玩家输入

标签: c# input console


【解决方案1】:

我为自己的应用程序这样做的方法是有一个专用线程调用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)
    }
}

【讨论】:

  • 嗯,我明白了,所以我想没有简单的方法。谢谢
【解决方案2】:

让循环在单独的线程中运行。

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....      
     }
  }
}

【讨论】:

    猜你喜欢
    • 2021-11-27
    • 1970-01-01
    • 2013-03-11
    • 2018-01-31
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    相关资源
    最近更新 更多