Windows服务上的多个计时器无法正常启动

时间:2012-03-30 20:23:37

标签: c# .net multithreading windows-services timer

我继承了一个Windows服务来增强我的公司。目前,该服务每天在指定的开始时间打印数据库中特定记录的报告。我添加了一个条件来设置第二个开始时间来运行相同的报告,省略特定的记录。我遇到的问题是我设置了两个单独的开始时间(通常相隔大约15分钟),它似乎跳过了第一个开始时间,如果报告文件已经存在,则只运行第二个开始时间。

    public partial class Service1 : ServiceBase
{
    Timer t1;
    Timer t2;
    bool Condition;

    public Service1()
    {
        InitializeComponent();
    }
    protected override void OnStart(string[] args)
    {
        t1 = new Timer();
        t1.Interval = (1000 * 60 * 3); // 3 minutes...
        t1.Elapsed += new ElapsedEventHandler(t1_Elapsed);
        t1.AutoReset = true;
        t1.Enabled = true;

        if (Condition) //Condition is an option in the configuration to determine if this timer should even start
        {
            t2 = new Timer();
            t2.Interval = (1000 * 60 * 3); // 3 minutes...
            t2.Elapsed += new ElapsedEventHandler(t2_Elapsed);
            t2.AutoReset = true;
            t2.Enabled = true;
        }
    }
    private void t1_Elapsed(object sender, ElapsedEventArgs e)
    {
        if (File.Exists("FileName1"))
        {
            string CurrentTime = DateTime.Now.ToShortDateString();

            if (CurrentTime == ConfigurationManager.AppSettings["StartTime"].ToString())
            {
                //Print Report
            }
        }
        else
        {
            //Print Report
        }
    }
    private void t2_Elapsed(object sender, ElapsedEventArgs e)
    {
        if (File.Exists("FileName2"))
        {
            string CurrentTime2 = DateTime.Now.ToShortDateString();

            if (CurrentTime2 == ConfigurationManager.AppSettings["StartTime2"].ToString())
            {
                //Print Report 2
            }
        }
        else
        {
            //Print Report 2
        }
    }        
    protected override void OnStop()
    {
        t1.Enabled = false;
        t2.Enabled = false;
    }
}

我无法弄清楚为什么第一个被跳过。两者都将检查文件是否存在,如果不存在则打印。下次运行时,第二个报告将在其预定时间打印,但第一个报告将被跳过。我似乎无法弄清楚我错过了什么。

1 个答案:

答案 0 :(得分:2)

你有没有机会使用错误的计时器? 我记得.Net中有大约2或3种类型的计时器:

System.Timers.Timer

System.Thread.Timer

System.Windows.Forms.Timer

我相信在windows服务中你应该使用前两个中的一个,更有可能是System.Timers.Timer,因为它通过SynchronizationObject属性提供线程安全性: System.Timers.Timer vs System.Threading.Timer