等待Keypress(或)N秒过期

时间:2012-08-02 20:50:34

标签: c# timer sleep keypress

假设我的控制台程序执行多个冗长的任务。在这些任务之间,我希望它暂停 - 无论是几秒钟还是,直到任何键被按下。 (以先到者为准。)

这些标准很容易自行检查,但是当我尝试组合它们时它们拒绝相处:在ReadKey启动之前,计时机制暂停几秒钟, Readkey阻止了直到满意为止。我怎样才能满足这两个条件?

5 个答案:

答案 0 :(得分:18)

在C#4.0中执行此操作的一种方法:

Task.Factory.StartNew(() => Console.ReadKey()).Wait(TimeSpan.FromSeconds(5.0));

答案 1 :(得分:3)

这样做的一种方法是根本没有计时器。创建一个让线程休眠25毫秒的循环,然后检查是否通过Console.KeyAvailable(非阻塞)按下了某个键,或者直到DateTime.Now()和{{1}}之间的时间为止。循环的开始已经超过了超时。

答案 2 :(得分:2)

从ikh的回答中延伸出来,我希望与我一起倒计时

        var original = DateTime.Now;
        var newTime = original;

        var waitTime = 10;
        var remainingWaitTime = waitTime;
        var lastWaitTime = waitTime.ToString();
        var keyRead = false;
        Console.Write("Waiting for key press or expiring in " + waitTime);
        do
        {
            keyRead = Console.KeyAvailable;
            if (!keyRead)
            {
                newTime = DateTime.Now;
                remainingWaitTime = waitTime - (int) (newTime - original).TotalSeconds;
                var newWaitTime = remainingWaitTime.ToString();
                if (newWaitTime != lastWaitTime)
                {
                    var backSpaces = new string('\b', lastWaitTime.Length);
                    var spaces = new string(' ', lastWaitTime.Length);
                    Console.Write(backSpaces + spaces + backSpaces);
                    lastWaitTime = newWaitTime;
                    Console.Write(lastWaitTime);
                    Thread.Sleep(25);
                }
            }
        } while (remainingWaitTime > 0 && !keyRead);

答案 3 :(得分:0)

启动两个主题。一个人听一下按键和其他等待一段时间。使主线程等待,除非任何一个完成。然后继续并忽略其他线程响应。 :)

答案 4 :(得分:0)

这样的东西?

bool IsPaused;
bool IsKeyPaused;

void Pause(){}
void UnPause(){}

void KeyDown(){
    if(!IsPaused)
    {
        IsPaused = true;
        IsKeyPaused = true;
        Pause();
    }
}
void KeyUp(){
    if(IsKeyPaused)
    {
        IsPaused = false;
        IsKeyPaused = false;
        UnPause();
    }
}
void TimerPause(){
    if(!IsPaused)
    {
        IsPaused = true;
        Pause();
    }
}
void TimerEnd(){
     UnPause();
}