我正在做一个控制台数学项目,用户可以回答多个数学问题。
我正试图添加一个倒计时计时器,但我找不到如何制作一个计时器,一旦用户回答了所有问题,计时器就会停止;
有人知道怎么做吗?
您可以很容易地用基于System.Threading.Timer
的版本替换Thread
代码。
我在你的GutHub中重构了你的代码:https://github.com/CrazyDanyal1414/mathstester.git
public class RunWithTimer
{
private DateTime _finish { get; set; }
public bool IsTimeLeft { get=> _finish > DateTime.Now; }
private System.Threading.Timer _timer = null;
private void TimerCallback(object state)
{
string timeLeft = (_finish - DateTime.Now).ToString(@"hh:mm:ss");
WriteToScreen($"Time Remaining: {timeLeft}", true);
if (!this.IsTimeLeft)
{
_timer.Dispose();
}
}
public RunWithTimer(int numberOfSeconds)
{
_finish = DateTime.Now.AddSeconds(numberOfSeconds);
_timer = new Timer(TimerCallback, null, TimeSpan.Zero, TimeSpan.FromSeconds(1.0));
}
public void StopTimer(int numberOfQuestionsLeft)
{
if (numberOfQuestionsLeft == 0)
{
_timer.Dispose();
}
}
}
理想情况下,RunWithTimer
将实现IDisposable
,因为它包含一个变量IDisposable
。一旦问题完成,您就可以删除它的StopTimer
和Dispose()
代码。
计时器、ProgressBars和类似的程序在Console中工作不太好。在GUI技术中,这种添加几乎是微不足道的。但在Console中执行此操作需要跳过重重关卡。可能会做一个重大的重新设计。
主要问题是,您需要能够接收输入,但不需要阻止代码执行。传统的控制台读取方法都是阻塞到最后。但是有一个变通办法。一种无阻塞等待输入的方法:
https://stackoverflow.com/a/5620647/3346583
这应该会对您有所帮助。虽然这个例子是一个windows窗体应用程序,但您可以使用Timer类来实现您想要的内容。