2011-07-11 55 views
2

[控制檯應用程序]C# - 如何「強制退出」一法

我想有一個計時器,(Thread.sleep代碼)的一種方法和運行沿側是另一種方法,等待着用戶的響應。如果在用戶可以響應之前計時器用完(ReadKey),那麼他們將失去生命。

簡而言之,我如何在計時器上有一個ReadKey?

+1

類似的問題http://stackoverflow.com/questions/57615/how-to-add-a-timeout-to-console-readline – Joe

+0

你使用的是.NET 4.0嗎? –

+0

...或C#5.0 CTP - 新的異步功能將非常適合。 – mdm

回答

5

Console.ReadKey()被阻塞,所以你不能使用它。

您可以循環使用Console.KeyAvailable()Thread.Sleep()。不需要定時器。

var lastKeyTime = DateTime.Now; 
... 
while (true) 
{ 
    if (Console.KeyAvailable()) 
    { 
     lastKeyTime = DateTime.Now; 
     // Read and process key 
    } 
    else 
    { 
     if (DateTime.Now - lastKeyTime > timeoutSpan) 
     { 
     lastKeyTime = DateTime.Now; 
     // lose a live 
     } 
    } 
    Thread.Sleep(50); // from 1..500 will work 
} 
+0

如果沿着這條路線走下去(並且需要任何準確的時間),確保記錄自倒計時開始以來的實際時間,而不是依賴睡眠間隔的倍數。 – SoftMemes

+0

你能展示一個示例代碼嗎? –

+0

您可以短時間休息,但使用DateTime.Now的毫秒(減去在進入循環之前保存的原始值)以查看總的經過時間。 –

0

您可以創建一個共享的ManualResetEvent,啓動一個新的線程(或使用線程池),並使用.WaitOne()方法與第二線程超時。在ReadKey()返回之後,您發出事件的信號,另一個線程將知道是否由於按下了鍵或者由於超時而被喚醒,並且可以做出相應的反應。

+1

問題是,當發生超時時,'ReadKey()'_doesn't_不會返回。 –

+0

@亨克的確 - 但程序邏輯仍然可以在其他線程上繼續。 ReadKey()還沒有返回,還是lanVal仍然想要讀鍵? – SoftMemes