我对C#中的控制台感到困惑...基本上,我一直试图将格式化的文本打印到控制台中,并且发现,只要我使用ReadKey,它实际上就会将该char读取到控制台中,这会使我的printOuts全部一发不可收拾。
这是一个愚蠢的例子,但我认为它没有所有多余的令人困惑的代码,这使我无法理解。
Console.ReadKey(); // Wait for user input before print
for (int i = 0; i<2000; i++)
{
Console.Write('*');
}
Console.ReadKey(); // pause console so it dose exit immediately
此代码等待一个ReadKey,ReadKey停止所有操作,直到读取该代码。然后,它只需打印大量*。
此代码的问题是,当您按下anyKey来“传递暂停”时,控制台实际上会读取该键。因此,如果按空格,第一个*是向前一个空格。如果您按ESC键,您实际上会在屏幕上看到一个奇怪的字符,但我不知道它的名字。
好吧..这真令人讨厌!然后,我尝试使用KeyAvailable ..如果未按下某个键,则返回true。这意味着您可以使用一段时间的while循环来知道是否按下了某个键,而无需实际使用ReadKey()。您甚至可以使用代码仅在按下某个键时才停止循环。如果愿意的话。
do
{ // do nothing in here.. just loop so it acts like a pause
} while (!Console.KeyAvailable);
for (int i = 0; i<2000; i++)
{
Console.Write('*');
}
Console.ReadKey(); // pause console so it dose exit immediately
这里的问题是,尽管这可行。控制台已经处理了某种形式的用户输入。.尽管它没有执行任何操作,但中断了该循环。
意味着将在下一个应该再次暂停的ReadKey()处使窗口停留在屏幕上。已经按了一个键,然后将该键应用于ReadKey()。应用程序立即关闭。
TL; DR
谢谢!
答案 0 :(得分:1)
多亏了Visual Vincent和Elgonzo,我已经找到/得到了解决方案。由于他们没有回复“帖子”,因此我无法将任何内容标记为已解决...因此我正在撰写此帖子,以将他们的观点汇总为该问题的已解决帖子。
您可以找到Console.ReadKey(booleens)<here>的.Net Api内容
基本上,这是说true / false参数将停止视觉反馈到控制台。
Console.ReadKey(true)
停止正在回显到控制台窗口中的读取键。这修复了“ 问题1 ”
其他“ 问题2 ”可以通过“清除输入命令缓冲区”来解决。...我不是100%确信这些术语是正确的..但是有一种方法可以使确保任何不必要的输入都被“使用了”,这样它们就不会干扰实际的用户输入。
while (Console.KeyAvailable) { Console.ReadKey(true); }
这是一个简单的while循环,通过调用ReadKey()并对输入不执行任何操作,循环直到清除所有缓冲的键。
也有关于ManualResetEvent的讨论,但我尚未对此进行研究。
感谢所有帮助!