C#使用计时器控制程序

时间:2018-09-05 11:54:45

标签: c#

我正在尝试创建一个类似于speedsum网站的控制台应用程序。 speedsum是一个非常有用且有趣的网站,可以在30秒钟内测试我们自己的数学能力。

经过几次尝试,我被认为可以创建一个具有相同概念的小型C#控制台应用程序。

以下是我的代码,效果很好。但是我无法显示倒计时?!

我的代码:

static void Main(string[] args)
    {
        int testCount = 0;

        Console.Write("\n Get.. Set... Go.... : This is a 30s test.. " +
            "Once each problem is completed the time finished will be shown \n Good Luck.. :) \n \n");
        Stopwatch watch = new Stopwatch();
        watch.Start();
        for (int i = 1; i < 100000; i++)
        {
            if (watch.Elapsed.TotalSeconds >= 30)
                break;
            TimeSpan timeSpan = TimeSpan.FromSeconds(Convert.ToInt32(watch.Elapsed.TotalSeconds));
            Console.Write($"\n {timeSpan.ToString("c")}" );

            Random r = new Random();
            int number1 = r.Next(10);
            int number2 = r.Next(10);
            int operation = r.Next(4);
            var method = (operation > 2) ? '+' : '*';
            int result = 0;
            result = method == '+' ? (number1 + number2) : (number1 * number2);             
            Console.Write($" \n {number1} {method} {number2} =  ");
            var getAnswer = Convert.ToInt32(Console.ReadLine());
            if (result == getAnswer)
            {
                testCount++;
                continue;
            }
            else
                break;
        }
        watch.Stop();

        if(testCount >= 1 && testCount <=5)
            Console.Write($"\n No Worries!! Try Hard ... \n you have solved {testCount} problems \n");
        else if(testCount >=6 && testCount <=10)
            Console.Write($"\n Good!! You can do well next time ... \n you have solved {testCount} problems \n");
        else
            Console.Write($"\n Awesome!! You are really a Genius ... \n you have solved {testCount} problems \n");

        Console.Write("\n Thank you for playing with me... \n Enter a key to exit");
        Console.Read();
    }

我想将倒计时从30秒降至0秒

Get.. Set... Go.... : This is a 30s test.. Once each problem is completed the time finished will be shown 
Good Luck.. :)

<<Timer Should go here>> (30, 29... 0)

5 * 5 = 25 ... 

SO Question显示了如何将倒数计入我们的程序,但是我对如何同时进行并行倒数和给出问题感到困惑。

任何建议对我都会有帮助。

1 个答案:

答案 0 :(得分:-2)

您似乎想使用BackgroundWorker。然后,DoWork事件将减少剩余的秒数,而ProgressChanged事件将报告当前的进度。该解决方案的优点是后台工作程序正在异步运行,因此您不会阻塞主线程,允许用户在他们希望的任何时间输入答案。

private static int secondsLeft;
private static BackgroundWorker bgWorker;

static void Main(string[] args)
{
    secondsLeft = 30;
    bgWorker = new BackgroundWorker();
    bgWorker.DoWork += bgWorker_DoWork;
    bgWorker.ProgressChanged += bgWorker_ProgressChanged;
    bgWorker.WorkerReportsProgress = true;
    bgWorker.RunWorkerAsync();

    Console.ReadLine();
}

private static void bgWorker_DoWork(object sender, DoWorkEventArgs e)
{
    while (secondsLeft >= 0)
    {
        bgWorker.ReportProgress(secondsLeft);
        Thread.Sleep(1000);
        secondsLeft--;
    }
}

private static void bgWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    Console.WriteLine($"Seconds left: {e.ProgressPercentage}");
}