Windows Service - 如何使任务在几个特定时间运行

本文关键字:几个 运行 定时间 Service 何使 任务 Windows | 更新日期: 2023-09-27 18:32:46

>我有一个Windows服务正在运行。在其中,任务目前每天晚上 7 点运行。让它在上午 9.45、上午 11.45、下午 2 点、下午 3.45、下午 5 点和下午 5.45 运行的最佳方法是什么。

我知道我可以有计划任务来运行该功能,但我想知道如何在我的 Windows 服务中执行此操作。当前代码如下:

private Timer _timer;
private DateTime _lastRun = DateTime.Now;
private static readonly log4net.ILog log = log4net.LogManager.GetLogger
(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
protected override void OnStart(string[] args)
{
    // SmartImportService.WebService.WebServiceSoapClient test = new WebService.WebServiceSoapClient();
    // test.Import();
     log.Info("Info - Service Started");
    _timer = new Timer(10 * 60 * 1000); // every 10 minutes??
    _timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
    _timer.Start();
}
private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
    log.Info("Info - Check time");
    DateTime startAt = DateTime.Today.AddHours(19);
    if (_lastRun < startAt && DateTime.Now >= startAt)
    {
        // stop the timer 
        _timer.Stop();               
        try
        {
           log.Info("Info - Import");
           SmartImportService.WebService.WebServiceSoapClient test = new WebService.WebServiceSoapClient();
           test.Import();
        }
        catch (Exception ex) {
           log.Error("This is my error - ", ex);
        }
        _lastRun = DateTime.Now;
        _timer.Start();
   }
}

Windows Service - 如何使任务在几个特定时间运行

如果您不想使用 cron 或石英,请编写一个函数来查找现在和下一次运行之间的时间间隔并相应地重置计时器,在服务启动和超时事件时调用此函数。你可以做这样的事情(代码没有测试)

   System.Timers.Timer _timer;
    List<TimeSpan> timeToRun = new List<TimeSpan>();
    public void OnStart(string[] args)
    {
        string timeToRunStr = "20:45;20:46;20:47;20:48;20:49";
        var timeStrArray = timeToRunStr.Split(';');
        CultureInfo provider = CultureInfo.InvariantCulture;
        foreach (var strTime in timeStrArray)
        {
            timeToRun.Add(TimeSpan.ParseExact(strTime, "g", provider));
        }
        _timer = new System.Timers.Timer(60*100*1000);
        _timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
        ResetTimer();
    }

    void ResetTimer()
    {
        TimeSpan currentTime = DateTime.Now.TimeOfDay;
        TimeSpan? nextRunTime = null;
        foreach (TimeSpan runTime in timeToRun)
        {
            if (currentTime < runTime)
            {
                nextRunTime = runTime;
                break;
            }
        }
        if (!nextRunTime.HasValue)
        {
            nextRunTime = timeToRun[0].Add(new TimeSpan(24, 0, 0));
        }
        _timer.Interval = (nextRunTime.Value - currentTime).TotalMilliseconds;
        _timer.Enabled = true;
    }
    private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        _timer.Enabled = false;
        Console.WriteLine("Hello at " + DateTime.Now.ToString());
        ResetTimer();
    }

考虑使用 Quartz.net 和 CronTrigger。

如果你清楚它应该运行什么时间表。然后在 Timeelapsed 事件中更改计时器的时间间隔,使其按计划运行。我从来没有尝试过

我会使用后台线程并让它执行一个无限循环,该循环可以完成您的工作并休眠 15 分钟。与使用计时器相比,服务代码会更干净、更简单。

请参阅MSDN上的这篇文章。