如何在特定时间停止秒表?
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()
,检查超时是否已过期。
好的,让我们来看看你的代码做了什么:
Console.WriteLine(WordBank.LevelOneWords);
。好的,您在控制台上打印一些文字。此语句正常完成并执行下一个语句。
stopWatch.Start( );
。好的,你启动秒表。时间开始流逝。执行前进到下一条语句。
if ( stopWatch.Elapsed.Seconds >= timeInSeconds )
。好的,这会在 你启动秒表之后 立即执行……也许几纳秒之后?如果 timeInSeconds
大于 0,则 stopWatch.Elapsed.Seconds >= timeInSeconds
将为假。
- 执行继续...
您预计第 2 步和第 3 步之间的秒数是如何以及何时经过的?
那么,你如何解决这个问题?好吧,最简单的方法是让用户键入单词,无论他有多慢:userType = Console.ReadLine( );
。 只有这样 检查经过的时间,如果它大于 timeInSeconds
通知用户他太慢了。
我正在制作一个每分钟单词数的程序(针对 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()
,检查超时是否已过期。
好的,让我们来看看你的代码做了什么:
Console.WriteLine(WordBank.LevelOneWords);
。好的,您在控制台上打印一些文字。此语句正常完成并执行下一个语句。stopWatch.Start( );
。好的,你启动秒表。时间开始流逝。执行前进到下一条语句。if ( stopWatch.Elapsed.Seconds >= timeInSeconds )
。好的,这会在 你启动秒表之后 立即执行……也许几纳秒之后?如果timeInSeconds
大于 0,则stopWatch.Elapsed.Seconds >= timeInSeconds
将为假。- 执行继续...
您预计第 2 步和第 3 步之间的秒数是如何以及何时经过的?
那么,你如何解决这个问题?好吧,最简单的方法是让用户键入单词,无论他有多慢:userType = Console.ReadLine( );
。 只有这样 检查经过的时间,如果它大于 timeInSeconds
通知用户他太慢了。