Windows服务 - 如何使任务运行在几个特定的​​时间? [英] Windows Service - How to make task run at several specific times?

查看:92
本文介绍了Windows服务 - 如何使任务运行在几个特定的​​时间?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个Windows服务运行。在它的任务目前在晚上7点,每天运行。
什么是有它运行的说冷杉例如在四十五分,上午11点45分,下午2点,下午3点45分,下午5点和下午5点45。



我知道的最好方式我可以有计划的任务运行功能,但我想知道如何在我的Windows服务中做到这一点。下面当前的代码:

 私人定时器_timer; 
私人的DateTime _lastRun = DateTime.Now;
私人静态只读log4net.ILog日志= log4net.LogManager.GetLogger
(System.Reflection.MethodBase.GetCurrentMethod()DeclaringType);

保护覆盖无效的OnStart(字串[] args)
{
// SmartImportService.WebService.WebServiceSoapClient测试=新WebService.WebServiceSoapClient();
// test.Import();
log.Info(信息 - 服务指南);
_timer =新的定时器(10 * 60 * 1000); //每10分钟?
_timer.Elapsed + =新System.Timers.ElapsedEventHandler(timer_Elapsed);
_timer.Start();
}

私人无效timer_Elapsed(对象发件人,System.Timers.ElapsedEventArgs E)
{
log.Info(信息 - 检查时间);
的DateTime startAt = DateTime.Today.AddHours(19);
如果(_lastRun< startAt&放大器;&放大器; DateTime.Now> = startAt)
{
//停止计时器
_timer.Stop();


{
log.Info(信息 - 导入);
SmartImportService.WebService.WebServiceSoapClient测试=新WebService.WebServiceSoapClient();
test.Import();
}
赶上(例外前){
log.Error(这是我的错误 - ,前);
}
_lastRun = DateTime.Now;
_timer.Start();
}
}


解决方案

在如果你不想去cron或石英,编写一个函数,找时间间隔现在到明年之间运行,因此复位定时器,呼吁服务启动和timeelapsed事件此功能。你可以做这样的事情(代码没有测试)

  System.Timers.Timer _timer; 
名单,LT;时间跨度> timeToRun =新的List<&TimeSpan的GT;();
公共无效的OnStart(字串[] args)
{

串timeToRunStr =20:45; 20:46; 20:47; 20:48; 20:49 ;
VAR timeStrArray = timeToRunStr.Split(';');
CultureInfo的提供商= CultureInfo.InvariantCulture;

的foreach(在timeStrArray变种strTime)
{
timeToRun.Add(TimeSpan.ParseExact(strTime,G,提供者));
}
_timer =新System.Timers.Timer(60 * 100 * 1000);
_timer.Elapsed + =新System.Timers.ElapsedEventHandler(timer_Elapsed);
ResetTimer();
}


无效ResetTimer()
{
时间跨度currentTime的= DateTime.Now.TimeOfDay;
时间跨度? nextRunTime = NULL;
的foreach(时间跨度运行时timeToRun)
{

如果(currentTime的<运行时)
{
nextRunTime =运行;
中断;
}
}
如果
{
nextRunTime = timeToRun [0]。新增(新时间跨度(24,0,0))(nextRunTime.HasValue!);
}
_timer.Interval =(nextRunTime.Value - currentTime的).T​​otalMilliseconds;
_timer.Enabled = TRUE;

}

私人无效timer_Elapsed(对象发件人,System.Timers.ElapsedEventArgs E)
{
_timer.Enabled = FALSE;
Console.WriteLine(你好在+ DateTime.Now.ToString());
ResetTimer();
}


I have a windows service running. Within it the task runs currently at 7pm every day. What is the best way to have it run say fir example at 9.45am, 11.45am, 2pm, 3.45pm, 5pm and 5.45pm.

I know i can have scheduled task to run the function but i would like to know how to do this within my windows service. Current code below:

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();
   }
}

解决方案

In case you dont want to go for cron or quartz, write a function to find time interval between now and next run and reset the timer accordingly, call this function on service start and timeelapsed event. You may do something like this (code is not tested)

   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();
    }

这篇关于Windows服务 - 如何使任务运行在几个特定的​​时间?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆