如何从 windows 服务启动计时器方法?
How to start method on timer from windows service?
我有一个方法可以在大约 10 分钟内执行。它本身就很顺利。我需要每小时使用 windows 服务启动此方法(这是强制性的)。所以我通过一些示例编写了我的服务(只是一个调用开始):
partial class ServiceWSDRun : ServiceBase
{
protected override void OnStart(string[] args)
{
Thread t = new Thread(WebServiceDownload.MainProgram.Execute);
t.Start();
}
}
现在,当我安装它时,它会在一个新线程中启动我的方法,但该线程似乎以 OnStart() 结束 - 它实际上记录了我方法开头的一些信息。为什么会停止,我该怎么办?
我在想最后我应该有这样的东西:
partial class ServiceWSDRun : ServiceBase
{
System.Timers.Timer timer = null;
protected override void OnStart(string[] args)
{
Thread t = new Thread(WebServiceDownload.MainProgram.Execute);
t.Start();
timer = new System.Timers.Timer();
timer.Interval = 60 * 60 * 1000; // 1 hour
timer.Elapsed += new System.Timers.ElapsedEventHandler(OnTimer);
timer.Enabled = true;
}
public void OnTimer(object sender, System.Timers.ElapsedEventArgs args)
{
WebServiceDownload.MainProgram.Execute();
}
protected override void OnStop()
{
timer.Enabled = false;
}
}
如何让它发挥作用?请记住,该方法需要大约 10 分钟才能执行。
您应该使用 System.Threading.Timer 而不是 System.Timers.Timer。
这里是参考:
https://msdn.microsoft.com/en-us/library/system.threading.timer(v=vs.110).aspx
此外,关于同一主题的另一个话题:
System.Timers.Timer vs System.Threading.Timer
您应该锁定执行,避免在第一次执行完成之前执行第二次。
我有一个方法可以在大约 10 分钟内执行。它本身就很顺利。我需要每小时使用 windows 服务启动此方法(这是强制性的)。所以我通过一些示例编写了我的服务(只是一个调用开始):
partial class ServiceWSDRun : ServiceBase
{
protected override void OnStart(string[] args)
{
Thread t = new Thread(WebServiceDownload.MainProgram.Execute);
t.Start();
}
}
现在,当我安装它时,它会在一个新线程中启动我的方法,但该线程似乎以 OnStart() 结束 - 它实际上记录了我方法开头的一些信息。为什么会停止,我该怎么办?
我在想最后我应该有这样的东西:
partial class ServiceWSDRun : ServiceBase
{
System.Timers.Timer timer = null;
protected override void OnStart(string[] args)
{
Thread t = new Thread(WebServiceDownload.MainProgram.Execute);
t.Start();
timer = new System.Timers.Timer();
timer.Interval = 60 * 60 * 1000; // 1 hour
timer.Elapsed += new System.Timers.ElapsedEventHandler(OnTimer);
timer.Enabled = true;
}
public void OnTimer(object sender, System.Timers.ElapsedEventArgs args)
{
WebServiceDownload.MainProgram.Execute();
}
protected override void OnStop()
{
timer.Enabled = false;
}
}
如何让它发挥作用?请记住,该方法需要大约 10 分钟才能执行。
您应该使用 System.Threading.Timer 而不是 System.Timers.Timer。
这里是参考:
https://msdn.microsoft.com/en-us/library/system.threading.timer(v=vs.110).aspx
此外,关于同一主题的另一个话题:
System.Timers.Timer vs System.Threading.Timer
您应该锁定执行,避免在第一次执行完成之前执行第二次。