可能重複:
How to add a Timeout to Console.ReadLine()?Console.ReadKey取消
如果我有一個Console.ReadKey(),它使整個程序卡住了,我該怎麼做,以便它將讀取1秒的密鑰,如果沒有讀取密鑰,則會設置其他內容。
可能重複:
How to add a Timeout to Console.ReadLine()?Console.ReadKey取消
如果我有一個Console.ReadKey(),它使整個程序卡住了,我該怎麼做,以便它將讀取1秒的密鑰,如果沒有讀取密鑰,則會設置其他內容。
你的意思是這樣的嗎?
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");
控制檯有一個屬性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
立即繼續,無論密鑰是否可用。如果一個鍵被按下並且準備通過ReadKey
和false
讀取,則返回true
。如果沒有密鑰可用,該功能會休眠50 ms直到執行下一個循環。這比沒有睡眠的循環更好,因爲這會給你100%的CPU使用率(在一個內核上)。
該函數返回ConsoleKeyInfo
爲ReadKey
會,如果你想知道用戶按下了哪個鍵。最後一行創建一個空的ConsoleKeyInfo
(請參閱ConsoleKeyInfo Structure和ConsoleKeyInfo Constructor)。它允許您測試用戶是否按下了按鍵或者該功能是否超時。
if (WaitForKey(1000).KeyChar == (char)0) {
// The function timed out
} else {
// The user pressed a key
}
嗯,這是它的工作,介意解釋這是如何工作的? – user1823701
添加說明。 (對不起,我認爲這很明顯)。 –
Console.KeyAvailable是如何工作的?最後的長線意味着什麼(以及那個假,假,假是什麼?)? – user1823701
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);
}
你得到一次一個問題。請選擇一個。 – user7116
由於提到了六個字母變量,您只需要一次提出一個問題,除非它們是同一個問題的兩個部分。這些不是。您應**編輯**您的問題以刪除其中一個問題並重命名標題。 – BlackVegetable
類似於http://stackoverflow.com/questions/57615/how-to-add-a-timeout-to-console-readline –