Несколько таймеров в службе Windows работают некорректно - PullRequest
2 голосов
/ 31 марта 2012

Я унаследовал службу 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 Ответ

2 голосов
/ 22 мая 2012

Есть ли вероятность, что вы используете неправильный таймер?Я помню, что в .Net было около 2 или 3 типов таймеров:

System.Timers.Timer

System.Thread.Timer

System.Windows.Forms.Timer

Я полагаю, что в службе Windows вы должны использовать один из первых двух, более вероятно System.Timers.Timer, поскольку он обеспечивает безопасность потоковчерез свойство SynchronizationObject: System.Timers.Timer против System.Threading.Timer

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...