2013-01-17 57 views
0

可能重複:
How to add a Timeout to Console.ReadLine()?Console.ReadKey取消

如果我有一個Console.ReadKey(),它使整個程序卡住了,我該怎麼做,以便它將讀取1秒的密鑰,如果沒有讀取密鑰,則會設置其他內容。

+4

你得到一次一個問題。請選擇一個。 – user7116

+0

由於提到了六個字母變量,您只需要一次提出一個問題,除非它們是同一個問題的兩個部分。這些不是。您應**編輯**您的問題以刪除其中一個問題並重命名標題。 – BlackVegetable

+3

類似於http://stackoverflow.com/questions/57615/how-to-add-a-timeout-to-console-readline –

回答

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"); 
2

控制檯有一個屬性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立即繼續,無論密鑰是否可用。如果一個鍵被按下並且準備通過ReadKeyfalse讀取,則返回true。如果沒有密鑰可用,該功能會休眠50 ms直到執行下一個循環。這比沒有睡眠的循環更好,因爲這會給你100%的CPU使用率(在一個內核上)。

該函數返回ConsoleKeyInfoReadKey會,如果你想知道用戶按下了哪個鍵。最後一行創建一個空的ConsoleKeyInfo(請參閱ConsoleKeyInfo StructureConsoleKeyInfo Constructor)。它允許您測試用戶是否按下了按鍵或者該功能是否超時。

if (WaitForKey(1000).KeyChar == (char)0) { 
    // The function timed out 
} else { 
    // The user pressed a key 
} 
+0

嗯,這是它的工作,介意解釋這是如何工作的? – user1823701

+0

添加說明。 (對不起,我認爲這很明顯)。 –

+0

Console.KeyAvailable是如何工作的?最後的長線意味着什麼(以及那個假,假,假是什麼?)? – user1823701

3
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); 
}