[英]C# Timer on Elapsed Time does not call method
以下類來自.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();
}
}
此代碼中存在許多嚴重問題:
我在windows-services中使用System.Threading.Timer
。
也許這也解決了你的問題,因為其他人也在Windows服務中的System.Timers.Timer
問題: “我發現System.Timers.Timer
在我的Windows服務應用程序中不起作用。所以我' ve切換到System.Threading.Timer
“
請參閱: Windows Service System.Timers.Timer未觸發
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();
}
您的程序在計時器運行之前結束。 Timer
正在后台線程中工作當主線程停止時終止。
嘗試
static void Main(string[] args)
{
Test t = new Test();
t.Start();
Console.ReadLine();
}
不要每次都創建一個新的計時器,而是嘗試將OnTimeout處理程序設置為:
_oTimer.Stop();
DoSomeDatabaseStuff();
_oTimer.Start();
與方法Start()類似。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.