2017-08-16 104 views
0

我創建了.net Windows服務,並計劃每5分鐘運行一次。 此Windows服務包含發送電子郵件並在發送電子郵件後更新表的代碼。計時器如何在.net Windows服務中工作?

首先我發送所有的電子郵件,然後更新數據庫中的所有記錄bulk.So我的問題是我設置的間隔爲5分鐘,它是否打破了我的情況,如果它需要5分鐘發送電子名片,然後計時器停止不更新數據庫,或繼續執行,直到它完全執行任務。

_timer = new Timer(5* 60 * 1000); 
_timer.Elapsed += new ElapsedEventHandler(OnTimerElapsed); 
_timer.AutoReset = true; 
_timer.Start(); 

........................

{//send one email at a time ..this is in loop 
Library.SendEmail(edtls); 

ds.Tables["EDts"].Rows[i]["Sent"] = 1; 
ds.Tables["EDts"].Rows[i]["Status"] = "Sent"; 
ds.Tables["EDts"].Rows[i].EndEdit(); 
}..how about timer stop execution here(it sends the emails but doesn't update the table) 
ds.Update(EDts, "EmailDts");//updating table here 
+0

_Which_'Timer' class? .NET定義了4種不同的方法,並且可能使用不正確的方法 – MickyD

+2

[瞭解C#中Timer控件的工作方式]的可能副本(https://stackoverflow.com/questions/8997838/understanding-working-of-timer-control- in-c-sharp) –

+0

這不是一個控件。 AutoReset = true是相當危險的,並且*即使在前一個滴答未完成時也會導致Elapsed事件處理程序運行。這很少會達到一個好結局。很容易修復,使用false並在事件處理程序結束時設置Enabled = true。在事件處理程序中始終使用try/catch來確保不會吞下異常。 –

回答

-1

呀所以這可能,如果發送電子郵件或者是棘手數據庫更新需要更長的時間來觸發定時器事件。您可以停止中間的計時器,然後繼續計時。

_timer.Stop(); 
{//send one email at a time ..this is in loop 
Library.SendEmail(edtls); 

ds.Tables["EDts"].Rows[i]["Sent"] = 1; 
ds.Tables["EDts"].Rows[i]["Status"] = "Sent"; 
ds.Tables["EDts"].Rows[i].EndEdit(); 
}..how about timer stop execution here(it sends the emails but doesn't update the table) 
ds.Update(EDts, "EmailDts");//updating table here 
_timer.Start(); 
+0

所有可能導致的結果都是不受歡迎的_re-entrancy_ – MickyD

+0

我會嘗試下面的代碼並查看_timer.Stop(); {//每次發送一封電子郵件..這是循環 Library.SendEmail(edtls); ds.Tables [「EDts」]。Rows [i] [「Sent」] = 1; ds.Tables [「EDts」]。行[i] [「狀態」] =「發送」;ds.Tables [「EDts」] .Rows [i] .EndEdit(); } ..定時器在這裏停止執行(它發送的電子郵件,但不更新表)012sds.Update(EDts,「EmailDts」);//在這裏更新表 _timer.Start(); – user8383606

+0

是否可以在發送每封電子郵件時調用數據庫更新,因爲如果我發送了100封電子郵件,並且發送了90封電子郵件並且剩餘的問題出現了,它也不會更新90封電子郵件。 – user8383606