我知道我可以使用ReadKey,但它会冻结应用程序直到用户按下一个键。是否有可能(在控制台应用程序中)运行一些循环仍然能够做出反应?我只能想到事件,但不知道如何在控制台中使用它们。
我的想法是循环将在每次迭代期间检查输入。
答案 0 :(得分:8)
我为自己的应用程序完成此操作的方法是让一个专用线程调用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 :(得分: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....
}
}
}