C# windows服务未按计划时间启动

C# windows服务未按计划时间启动,c#,.net,magento,windows-services,poller,C#,.net,Magento,Windows Services,Poller,我有一个windows服务,它与MagentoAPI通信以提取数据。windows服务首次启动时运行正常,没有任何错误或问题。 有一个poller incorporated,它计算下一次执行windows服务的时间,并在配置文件中指定键值“pollerExecutionTime”。我注意到,尽管将windows服务设置为自动启动类型,但它并没有在计划的时间启动。 这是轮询器的代码。如果有人能看一看并告诉我我做错了什么,这将是非常有帮助的,因为我不擅长调试windows服务 private Dat

我有一个windows服务,它与MagentoAPI通信以提取数据。windows服务首次启动时运行正常,没有任何错误或问题。 有一个poller incorporated,它计算下一次执行windows服务的时间,并在配置文件中指定键值“pollerExecutionTime”。我注意到,尽管将windows服务设置为自动启动类型,但它并没有在计划的时间启动。 这是轮询器的代码。如果有人能看一看并告诉我我做错了什么,这将是非常有帮助的,因为我不擅长调试windows服务

private DateTime _nextExecutionTime;

    public DateTime NextExecutionTime
    {
        get { 

            //if(_nextExecutionTime!=null)
            //    return _nextExecutionTime;

            return _nextExecutionTime = GetNextExecutionTime(Convert.ToDateTime(ConfigurationManager.AppSettings["pollerExecutionTime"]).TimeOfDay, DateTime.Now.AddDays(1).DayOfWeek); 
        }
        set { 

            _nextExecutionTime = value; 
        }
    }

    protected override void OnStart(string[] args)
    {
        DebugMode();

        try
        {
            System.Threading.Thread.Sleep(10000);

            if (!StartService())
            {
                Stop();
            }
        }
        catch (Exception exception)
        {
            _logEntryError.Message = "OnStart: Cannot start the service due the following reason " + exception.Message + Environment.NewLine + exception.InnerException + Environment.NewLine + exception.StackTrace;

            Logger.Write(_logEntryError);
        }

        //StartService();
    }

    private bool StartService()
    {
        _timer.Elapsed += new ElapsedEventHandler(OnElapsedTime);
        _timer.Interval = 10000; //First time after 10 sec
        _timer.Enabled = true;
        _timer.AutoReset = true;

        _logEntryStart.Message = "Execution of  CheckLongtimePendingRequestsAndDelegate Method -- STARTED";

        _logEntryEnd.Message = "Execution of  CheckLongtimePendingRequestsAndDelegate Method -- ENDED";

        return true;
    }

    protected override void OnStop()
    {

    }

    [Conditional("DEBUG_SERVICE")]
    private static void DebugMode()
    {
        Debugger.Break();
    }


    private void OnElapsedTime(object source, ElapsedEventArgs e)
    {
       TimeSpan difference = NextExecutionTime.Subtract(DateTime.Now.Date);

       _timer.Interval = difference.TotalMilliseconds;

        try
        {
            Logger.Write(_logEntryStart);

            _svc.GetOrderList();
            _svc.GetCustomerList();
            _svc.GetInvoiceList();
        }
        catch (Exception exception)
        {
            _logEntryError.Message = "Error by invoking the WebMethods Method : " + exception.Message + Environment.NewLine + exception.InnerException + Environment.NewLine + exception.StackTrace;

            Logger.Write(_logEntryError);
        }

    }
    public static DateTime GetNextExecutionTime(TimeSpan time, DayOfWeek targetDayOfWeek)
    {
        var date = new DateTime(
            DateTime.Now.Year,
            DateTime.Now.Month,
            DateTime.Now.Day,
            time.Hours,
            time.Minutes,
            time.Seconds).AddDays(GetDaysToNextWeekDay(DateTime.Now,  targetDayOfWeek));

        return date;
    }

    /// <summary>
    /// Gets the days to next week day.
    /// </summary>
    /// <param name="startDate">The start date.</param>
    /// <param name="targetDayOfWeek">The target day of week.</param>
    /// <returns></returns>
    /// <remarks></remarks>
    public static int GetDaysToNextWeekDay(DateTime startDate, DayOfWeek      targetDayOfWeek)
    {
        int start = (int)startDate.DayOfWeek;
        int target = (int)targetDayOfWeek;

        if (target <= start)
            target += 7;

        return target - start;
    } 
private DateTime\u nextExecutionTime;
公共日期时间NextExecutionTime
{
获取{
//如果(_nextExecutionTime!=null)
//返回下一次执行时间;
return _nextExecutionTime=GetNextExecutionTime(Convert.ToDateTime(ConfigurationManager.AppSettings[“pollerExecutionTime”])).TimeOfDay、DateTime.Now.AddDays(1).DayOfWeek;
}
集合{
_nextExecutionTime=值;
}
}
启动时受保护的覆盖无效(字符串[]args)
{
调试模式();
尝试
{
系统线程线程睡眠(10000);
如果(!StartService())
{
停止();
}
}
捕获(异常)
{
_logEntryError.Message=“OnStart:无法启动服务,原因如下”+exception.Message+Environment.NewLine+exception.InnerException+Environment.NewLine+exception.StackTrace;
Logger.Write(_logEntryError);
}
//StartService();
}
私人布尔StartService()
{
_timer.appeased+=新的ElapsedEventHandler(OneLassedTime);
_timer.Interval=10000;//10秒后第一次
_timer.Enabled=true;
_timer.AutoReset=true;
_logEntryStart.Message=“CheckLongtimePendingRequestsAndDelegate方法的执行——已启动”;
_logEntryEnd.Message=“CheckLongtimePendingRequestsAndDelegate方法的执行——结束”;
返回true;
}
受保护的覆盖void OnStop()
{
}
[有条件的(“调试服务”)]
私有静态void DebugMode()
{
Debugger.Break();
}
private void OneLassedTime(对象源,ElapsedEventArgs e)
{
TimeSpan差=NextExecutionTime.Subtract(DateTime.Now.Date);
_timer.Interval=difference.total毫秒;
尝试
{
Logger.Write(_logEntryStart);
_GetOrderList();
_svc.GetCustomerList();
_svc.GetInvoiceList();
}
捕获(异常)
{
_logEntryError.Message=“调用WebMethods方法时出错:”+exception.Message+Environment.NewLine+exception.InnerException+Environment.NewLine+exception.StackTrace;
Logger.Write(_logEntryError);
}
}
公共静态日期时间GetNextExecutionTime(TimeSpan时间,DayOfWeek目标DayOfWeek)
{
var date=新日期时间(
DateTime.Now.Year,
DateTime.Now.Month,
DateTime.Now.Day,
时间,小时,
时间,分钟,
AddDays(GetDaysToNextWeekDay(DateTime.Now,targetDayOfWeek));
返回日期;
}
/// 
///获取到下星期天的天数。
/// 
///开始日期。
///一周中的目标日期。
/// 
/// 
公共静态int GetDaysToNextWeekDay(日期时间开始日期,DayOfWeek目标日期)
{
int start=(int)startDate.DayOfWeek;
int target=(int)targetDayOfWeek;

如果(目标自动启动类型仅适用于计算机启动时。您在这里与自己作对。不要停止服务,只让它休眠,直到它必须再次执行某项操作。但当它应该在第二天的指定时间运行时,它不会再次启动。请检查您的逻辑以计算下一个间隔。如果您正在设置\u timer.Interval设置为小于0英寸的值,在您执行任何操作之前,它将出错。建议不要重置时间间隔。只需让计时器以常规间隔轮询,并且仅在经过适当的时间后执行操作。