C# windows服务未按计划时间启动
我有一个windows服务,它与MagentoAPI通信以提取数据。windows服务首次启动时运行正常,没有任何错误或问题。 有一个poller incorporated,它计算下一次执行windows服务的时间,并在配置文件中指定键值“pollerExecutionTime”。我注意到,尽管将windows服务设置为自动启动类型,但它并没有在计划的时间启动。 这是轮询器的代码。如果有人能看一看并告诉我我做错了什么,这将是非常有帮助的,因为我不擅长调试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
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英寸的值,在您执行任何操作之前,它将出错。建议不要重置时间间隔。只需让计时器以常规间隔轮询,并且仅在经过适当的时间后执行操作。