c # чтение ввода пользователя без остановки приложения - PullRequest
6 голосов
/ 14 октября 2010


Я знаю, что могу использовать ReadKey для этого, но приложение будет зависать, пока пользователь не нажмет клавишу.Возможно ли (в консольном приложении) запустить какой-либо цикл и при этом иметь возможность реагировать?Я могу думать только о событиях, но не знаю, как их использовать в консоли.Моя идея заключалась в том, что цикл будет проверять ввод во время каждой итерации.

Ответы [ 2 ]

8 голосов
/ 14 октября 2010

То, как я сделал это для своего собственного приложения, заключалось в том, чтобы иметь выделенный поток, который вызывает 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)
    }
}
1 голос
/ 14 октября 2010

Запустите цикл в отдельном потоке.

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