加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c#在不停止应用的情况下读取用户输入

发布时间:2020-12-15 08:20:40 所属栏目:百科 来源:网络整理
导读:我知道我可以使用ReadKey,但它会冻结应用程序直到用户按下一个键.是否有可能(在控制台应用程序中)运行一些循环仍然能够做出反应?我只能想到事件,但不知道如何在控制台中使用它们. 我的想法是循环将在每次迭代期间检查输入. 解决方法 我为自己的应用程序完成
我知道我可以使用ReadKey,但它会冻结应用程序直到用户按下一个键.是否有可能(在控制台应用程序中)运行一些循环仍然能够做出反应?我只能想到事件,但不知道如何在控制台中使用它们.
我的想法是循环将在每次迭代期间检查输入.

解决方法

我为自己的应用程序完成此操作的方式是有一个专用线程调用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)
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读