Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Windows服务-如何使任务在多个特定时间运行?_C#_Windows Services - Fatal编程技术网

C# Windows服务-如何使任务在多个特定时间运行?

C# Windows服务-如何使任务在多个特定时间运行?,c#,windows-services,C#,Windows Services,我有一个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 = lo

我有一个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();
   }
}
private Timer\u Timer;
private DateTime\u lastRun=DateTime.Now;
私有静态只读log4net.ILog log=log4net.LogManager.GetLogger
(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
启动时受保护的覆盖无效(字符串[]args)
{
//SmartImportService.WebService.WebServiceSoapClient测试=新建WebService.WebServiceSoapClient();
//test.Import();
log.Info(“信息-服务已启动”);
_定时器=新定时器(10*60*1000);//每10分钟一次??
_timer.appeated+=新系统.Timers.ElapsedEventHandler(timer_appeated);
_timer.Start();
}
私有无效计时器(对象发送器,System.Timers.ElapsedEventArgs e)
{
log.Info(“信息-检查时间”);
DateTime startAt=DateTime.Today.AddHours(19);
如果(_lastRun=startAt)
{
//停止计时
_timer.Stop();
尝试
{
log.Info(“信息导入”);
SmartImportService.WebService.WebServiceSoapClient测试=新建WebService.WebServiceSoapClient();
test.Import();
}
捕获(例外情况除外){
log.Error(“这是我的错误-”,ex);
}
_lastRun=DateTime.Now;
_timer.Start();
}
}

如果你清楚它应该运行什么计划..那么在timeappeased事件中更改计时器的时间间隔,使其按照计划运行..我从来没有尝试过,但我会使用后台线程,使其执行无限循环,执行你的工作和睡眠15分钟。对于服务代码来说,这将比使用计时器更干净、更简单


请参阅MSDN上的文章。

考虑使用and。

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

System.Timers.Timer\u定时器;
List timeToRun=新列表();
公共void OnStart(字符串[]args)
{
字符串timeToRunStr=“20:45;20:46;20:47;20:48;20:49”;
var timeStrArray=timeToRunStr.Split(“;”);
CultureInfo provider=CultureInfo.InvariantCulture;
foreach(时间序列中的var strTime)
{
Add(TimeSpan.ParseExact(strTime,“g”,provider));
}
_定时器=新系统定时器定时器定时器(60*100*1000);
_timer.appeated+=新系统.Timers.ElapsedEventHandler(timer_appeated);
重置计时器();
}
void ResetTimer()
{
TimeSpan currentTime=DateTime.Now.TimeOfDay;
TimeSpan?nextRunTime=null;
foreach(timeToRun中的TimeSpan运行时)
{
如果(当前时间<运行时)
{
nextRunTime=运行时;
打破
}
}
如果(!nextRunTime.HasValue)
{
nextRunTime=timeToRun[0]。添加(新的时间跨度(24,0,0));
}
_timer.Interval=(nextRunTime.Value-currentTime).total毫秒;
_timer.Enabled=true;
}
私有无效计时器(对象发送器,System.Timers.ElapsedEventArgs e)
{
_timer.Enabled=false;
WriteLine(“Hello at”+DateTime.Now.ToString());
重置计时器();
}

我已经下载了Quartz,你能给我举个例子说明如何在我的代码中实现CronTrigger吗?检查教程并询问你是否有任何具体问题timeToRun何时设置?我得到错误…System.NullReferenceException:对象引用未设置为对象的实例。在SmartUploadSyncService.Service1.ResetTimer()中,让我们反复运行函数,它没有使用时间
   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();
    }