安慰ReadKey正在取消
本文关键字:取消 ReadKey 安慰 | 更新日期: 2023-09-27 17:54:27
可能重复:
如何将超时添加到控制台。ReadLine((?
如果我有控制台。ReadKey((,它使整个程序卡住,我如何使它读取一个键1秒,如果一个键没有读取,就会设置其他东西。
控制台具有属性KeyAvailable
。但是您想要的功能(超时(不可用。您可以编写自己的函数
private static ConsoleKeyInfo WaitForKey(int ms)
{
int delay = 0;
while (delay < ms) {
if (Console.KeyAvailable) {
return Console.ReadKey();
}
Thread.Sleep(50);
delay += 50;
}
return new ConsoleKeyInfo((char)0, (ConsoleKey)0, false, false, false);
}
此功能循环,直到所需时间(以毫秒为单位(过去或按下某个键。它在调用Console.ReadKey();
之前检查一个密钥是否可用。无论密钥是否可用,检查Console.KeyAvailable
都立即继续。如果按键已按下,则返回true
,否则准备由ReadKey
和false
读取。如果没有可用的键,该函数将休眠50毫秒,直到执行下一个循环。这比不睡觉就循环要好,因为这会让你(在一个内核上(使用100%的CPU。
如果您想知道用户按下了哪个键,函数会像返回ReadKey
一样返回ConsoleKeyInfo
。最后一行创建一个空的ConsoleKeyInfo
(请参阅ConsoleKeyInfo Structure和ConsoleKeyInformation Constructor(。它允许您测试用户是否按下了某个键或功能是否超时。
if (WaitForKey(1000).KeyChar == (char)0) {
// The function timed out
} else {
// The user pressed a key
}
static ConsoleKeyInfo? MyReadKey()
{
var task = Task.Run(() => Console.ReadKey(true));
bool read = task.Wait(1000);
if (read) return task.Result;
return null;
}
var key = MyReadKey();
if (key == null)
{
Console.WriteLine("NULL");
}
else
{
Console.WriteLine(key.Value.Key);
}
你的意思是这样的吗?
Console.WriteLine("Waiting for input for 10 seconds...");
DateTime start = DateTime.Now;
bool gotKey = false;
while ((DateTime.Now - start).TotalSeconds < 10)
{
if (Console.KeyAvailable)
{
gotKey = true;
break;
}
}
if (gotKey)
{
string s = Console.ReadLine();
}
else
Console.WriteLine("Timed out");