以下课程来自.Net Windows服务。方法 DoSomeDatabaseStuff 在第一次启动时需要10分钟,但是当时间结束时,此方法不会再次被调用。
public class Test
{
public void Start()
{
DoSomeDatabaseStuff();
_oTimer = new Timer(60000);
_oTimer.Elapsed += OnTimeout;
_oTimer.AutoReset = true;
_oTimer.Start();
}
private void OnTimeout(object source, ElapsedEventArgs e)
{
DoSomeDatabaseStuff();
_oTimer = new Timer(60000);
_oTimer.Elapsed += OnTimeout;
_oTimer.AutoReset = true;
_oTimer.Start();
}
}
答案 0 :(得分:6)
此代码中存在许多严重问题:
答案 1 :(得分:3)
我在windows-services中使用System.Threading.Timer
。
也许这也解决了您的问题,因为其他人在Windows服务中System.Timers.Timer
也存在问题:"我发现System.Timers.Timer
只是没有&# 39;在我的Windows服务应用程序中工作。因此,我已切换到System.Threading.Timer
"
请参阅:Windows Service System.Timers.Timer not firing
private void InitService()
{
//starts immediately, interval is in TimeSpan
this._oTimer = new System.Threading.Timer(
OnTimeout,
null,
TimeSpan.Zero,
TimeSpan.FromMinutes(10)
);
}
protected override void OnStart(string[] args)
{
InitService();
}
protected override void OnStop()
{
this._oTimer.Change(System.Threading.Timeout.Infinite, System.Threading.Timeout.Infinite);
}
private void ImportTimer_Elapsed(Object state)
{
DoSomeDatabaseStuff();
}
答案 2 :(得分:2)
您的程序在计时器运行之前结束。 Timer
工作static void Main(string[] args)
{
Test t = new Test();
t.Start();
Console.ReadLine();
}
当主线程停止时,会终止。
尝试
{{1}}
答案 3 :(得分:1)
不是每次都创建一个新的计时器,而是尝试将OnTimeout处理程序设置为:
_oTimer.Stop();
DoSomeDatabaseStuff();
_oTimer.Start();
与方法Start()类似。