0

我正在尝试制作一个从 15 分钟到 0 秒的“简单”计时器。我用 900 秒作为我的 15 分钟。当我运行程序时,它运行良好,但继续进入负面状态。我还是 C# 的新手。我希望代码在 0 处停止并运行警报以引起某人的注意。这是我到目前为止所拥有的

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Timers;

namespace GBS_GI_Timer
{
   public class Program
    {
       public static int t = 2;

        public static void Main()
        {
            System.Timers.Timer aTimer = new System.Timers.Timer();

            // Hook up the Elapsed event for the timer.
            aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);

            aTimer.Interval = 1000;
            aTimer.Enabled = true;

            //Console.WriteLine("Press the Enter key to exit the program.");
            Console.ReadLine();


            //GC.KeepAlive(aTimer);
            if (t == 0)
            aTimer.Stop();
        }
        public static void OnTimedEvent(object source, ElapsedEventArgs e)
        {
            //TimeSpan timeRemaining = TimeSpan.FromSeconds(t);

            Console.WriteLine("Time remianing..{0}", t);
            t--;

            if (t == 0)
            {
                Console.WriteLine("\a");
                Console.WriteLine("Time to check their vitals, again!");
                Console.WriteLine("Press any key to exit...");
            }
            // Console.ReadKey();
            Console.ReadLine();
        }
    }
}
4

3 回答 3

3

您已对其进行了编码,以便当您按 Enter(或键入某些内容并按 Enter)时,它会检查 t 并可能会停止计时器。您正在检查 t == 0 是否然后才停止计时器。如果在您按 Enter 之前 t 小于零会发生什么?

于 2012-05-15T19:56:53.503 回答
1

您必须按如下方式重构您的代码才能使其正常工作,System.Timers.Timer 使用 ThreadPool 来运行回调例程。

class Program
{
    public static int t = 2;
    static System.Timers.Timer aTimer = new System.Timers.Timer();

    public static void Main()
    {

        // Hook up the Elapsed event for the timer.
        aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);

        aTimer.Interval = 1000;
        aTimer.Enabled = true;

        Console.ReadLine();
    }
    public static void OnTimedEvent(object source, ElapsedEventArgs e)
    {
        Console.WriteLine("Time remianing..{0}", t);
        t--;

        if (t == 0)
        {
            Console.WriteLine("\a");
            Console.WriteLine("Time to check their vitals, again!");
            Console.WriteLine("Press any key to exit...");
            aTimer.Stop();
            Console.ReadLine();
        }
    }
}
于 2012-05-15T20:07:32.843 回答
0

你的程序还有一些其他的逻辑问题,不过我不确定它是否会按照你的意愿运行,即使它正在运行。

我会重构你的 OnTimedEvent 来做

Console.WriteLine(string.Format("{0} time to check their vitals!"));

并使用 while 循环检查主程序中 t 的状态。

您还可以在进入处理程序时更改 Timer.Interval 以便在确认第一个事件之前不会触发其他事件,但是您不能保证此例程运行 15 分钟...

于 2012-05-15T19:58:31.693 回答