在C#控制台应用程序中等待用户输入的时间设置

4

对于一个控制台应用程序,我需要知道如何在设置的时间(大约10秒)内等待用户输入一个键或一组键,然后再继续执行应用程序的“自动运行”部分。

这让我感到困扰,因为我无法弄清楚计时器是如何工作的,或者使用线程休眠,我应该使用什么?我一整天都在搜索。

一些伪代码:

1.应用程序打开

2.应用程序等待10秒钟让用户按“k”键。

3.如果用户按下k,则转到4。如果用户没有,则转到5。

4.运行一个函数(打开一个表单)

5.运行一个函数(做某事)

我打赌这很简单,只是我不明白发生了什么。


什么类型的程序?WinForms? - SLaks
这是一个控制台应用程序还是一个窗体应用程序? - user113476
请再解释一些信息。你所说的“自动运行”是什么意思?你能举几个例子来说明应用程序应该如何表现吗? - Shoban
2
奇怪的用户界面设计。如果用户打喷嚏并需要11秒钟才能完成输入,会发生什么? - Hans Passant
这是一个控制台应用程序。抱歉,让我改变我的问题。谢谢您的关注。另外,自动运行是指自动继续应用程序进程。 - Marlon
我需要它能够在自动模式下运行,或者如果由用户运行,则进行配置。就像当您启动Windows时,您有大约2秒钟的时间按f8或其他键... - Marlon
4个回答

11
这是一个C#控制台应用程序的示例代码。它不使用计时器,而是使用Sleep。相比基于计时器的代码,它可能更容易理解一些。
        static void openForm()
        {
            Console.WriteLine("Form opened!");
        }

        static void doSomething()
        {
            Console.WriteLine("Do something!");
        }

        static void Main(string[] args)
        {
            bool optionForm = false;
            int seconds = 1;

            Console.Write("Press 'k' to open form");

            while (true)
            {                
                if (Console.KeyAvailable)
                {
                    ConsoleKeyInfo c = Console.ReadKey(true);
                    if (c.Key == ConsoleKey.K)
                    {                        
                        optionForm = true;
                        break;
                    }
                }

                System.Threading.Thread.Sleep(1000);

                if (seconds++ > 10)
                    break;

                Console.Write('.');
            }

            Console.WriteLine();

            if (optionForm)
                openForm();
            else
                doSomething();

            Console.ReadKey();
        }

我最终使用了定时器,但这看起来很棒。我点赞了它。 - Marlon

4

设置一个10秒的定时器。

当定时器到期时,触发一个事件。

在事件处理程序中继续执行“自动运行”部分。

如果用户在定时器到期之前按下任意键,则终止线程。

Timer类页面上有一个等待一段时间的定时器示例。


好的。我认为这可能有所帮助!我的大脑 - Marlon
现在我需要读取计时器期间输入键的部分。我有一个while循环(当键不等于'K'时)。我应该这样做吗?我现在感觉像是编程便秘了。 - Marlon
@Marlon - 这样做是可行的,但并不必要。在按键处理程序中设置一个键按下事件,在用户按下“K”时停止线程即可。 - ChrisF
好的,我已经完成了。没有代码示例,但我将其标记为答案。谢谢! - Marlon

1

谢谢Marlon!这真的帮了我很多。

我使用了以下代码:

int minutes = 1;
while (true)
{
   if (Console.KeyAvailable)
   {
        ConsoleKeyInfo c = Console.ReadKey(true);
    if (c.Key == ConsoleKey.Enter)
    {
            break;
    }
   }
   Thread.Sleep(1000);
   if (minutes++ > 10)
   {
    throw;
   }
}

不是分钟而是秒,我从未见过一个单独的 throwcatch 之外。 - mafu

0

这里有一些代码,可以为您解决问题。

        Form1 f = new Form1();
        System.Threading.Timer t = new System.Threading.Timer(o => f.Invoke(new Action(() => f.textBox1.Enabled = true)), null, 10000, System.Threading.Timeout.Infinite);
        f.ShowDialog();
        t.Change(System.Threading.Timeout.Infinite, System.Threading.Timeout.Infinite);

谢谢您的回答。但是我没有看到您在规定的时间内如何判断用户的输入。也许我应该稍微修改一下我的问题。:( - Marlon
是的,问题现在清晰多了。我的答案不是对编辑后问题的解决方案。 - Greg Bogumil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接