如何在特定时间停止秒表?

How do I stop a stopwatch at a certain amount of time?

我正在制作一个每分钟单词数的程序(针对 class),根据我一直在研究的内容,这个 应该 有效。基本上,如果计时器达到 10 秒,我希望秒表停止(虽然这不是必需的)并阻止用户再打字。我将如何实现这一目标?

public void Timer30()
    {
        double userCharcount = 0;
        string userType;
        int timeInSeconds = 10;


        //new instance of stopwatch
        Stopwatch stopWatch = new Stopwatch( );

        //call level 1 words from wordbank
        Console.WriteLine(WordBank.LevelOneWords);
        stopWatch.Start( );

        //**this doesn't seem to work**
        if ( stopWatch.Elapsed.Seconds >= timeInSeconds )
        { Console.WriteLine("Time's up! Nice work.");
            stopWatch.Stop( );
            Console.ReadKey(); 
        }

        userType = Console.ReadLine( );
        stopWatch.Stop( );


        //capture number of characters user types to calculate WPM
        userCharcount = userType.Length;

        // Get the elapsed time as a TimeSpan value.
        TimeSpan ts = stopWatch.Elapsed;

        // Format and display the TimeSpan value.
        string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}" ,
            ts.Hours , ts.Minutes , ts.Seconds ,
            ts.Milliseconds / 10);
        Console.WriteLine("\nNice job! You finished in " + elapsedTime + "!");
        Thread.Sleep(2000);
        //CalculateWPMEasy(userCharCount);

    }

在这种情况下,您不能使用 Console.ReadLine(),因为在用户按下 Enter 之前,return 无法控制您的程序。尝试在循环中使用 Console.ReadKey(),检查超时是否已过期。

好的,让我们来看看你的代码做了什么:

  1. Console.WriteLine(WordBank.LevelOneWords);。好的,您在控制台上打印一些文字。此语句正常完成并执行下一个语句。
  2. stopWatch.Start( );。好的,你启动秒表。时间开始流逝。执行前进到下一条语句。
  3. if ( stopWatch.Elapsed.Seconds >= timeInSeconds )。好的,这会在 你启动秒表之后 立即执行……也许几纳秒之后?如果 timeInSeconds 大于 0,则 stopWatch.Elapsed.Seconds >= timeInSeconds 将为假。
  4. 执行继续...

您预计第 2 步和第 3 步之间的秒数是如何以及何时经过的?

那么,你如何解决这个问题?好吧,最简单的方法是让用户键入单词,无论他有多慢:userType = Console.ReadLine( );只有这样 检查经过的时间,如果它大于 timeInSeconds 通知用户他太慢了。