不可阻挡的计时器

时间:2012-05-15 19:53:23

标签: c#

我正试图在15分钟到0秒之间制作一个“简单”的计时器。我用了15秒就用了900秒。当我运行该程序时,它运行良好,但继续进入否定。我仍然是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();
        }
    }
}

3 个答案:

答案 0 :(得分:3)

你已经对它进行了编码,这样当你点击输入(或输入内容并点击回车)时,它会检查t并可能会停止计时器。您正在检查t == 0,然后才停止计时器。如果在你输入之前t小于零会发生什么?

答案 1 :(得分: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();
        }
    }
}

答案 2 :(得分:0)

您的程序存在一些其他逻辑问题,但我不确定即使它正在运行也会执行您想要的操作。

我会重构你的OnTimedEvent来做

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

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

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