Console.ReadKey canceling [duplicate]

2019-08-24 04:38发布

Possible Duplicate:
How to add a Timeout to Console.ReadLine()?

If I have a Console.ReadKey(), It makes the whole program stuck, how can I make it so that it will read a key for 1 second, and if a key is not read, something else would be set.

标签: c# readkey
3条回答
唯我独甜
2楼-- · 2019-08-24 04:53

The console has a property KeyAvailable. But your desired functionality (timeout) is not available. You could write your own function

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

This function loops until the desired time in milliseconds has elapsed or a key has been pressed. It checks to see whether a key is available before it calls Console.ReadKey();. The check Console.KeyAvailable continues immediately, whether a key is available or not. It returns true if a key has been pressed and is ready to be read by ReadKey and false otherwise. If no key is available the function sleeps for 50 ms until it performs the next loop. This is better than looping without sleeping, because that would give you 100% CPU usage (on one core).

The function returns a ConsoleKeyInfo as ReadKey would, in case you want to know which key the user has pressed. The last line creates an empty ConsoleKeyInfo (see ConsoleKeyInfo Structure and ConsoleKeyInfo Constructor). It allows you to test whether the user pressed a key or whether the function timed out.

if (WaitForKey(1000).KeyChar == (char)0) {
    // The function timed out
} else {
    // The user pressed a key
}
查看更多
何必那么认真
3楼-- · 2019-08-24 04:56

Do you mean something like this?

    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");
查看更多
该账号已被封号
4楼-- · 2019-08-24 05:11
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);
}
查看更多
登录 后发表回答