在asp.net forums2 或cs 系統中, 每過幾分種會發送一次email, 但是如果在執行時,資料庫伺服器重新啟動。
會導致Send Email 線程死掉。
參考代碼:
private void ScheduledWorkCallbackEmailInterval (object sender)
{
try {
// suspend the timer while we process emails
emailTimer.Change( System.Threading.Timeout.Infinite, EmailInterval );
// Send emails
//
Emails.SendQueuedEmails( (HttpContext) sender);
// Update anonymous users
//
Users.UpdateAnonymousUsers( (HttpContext) sender);
}
catch( Exception e ) {
ForumException fe = new ForumException( ForumExceptionType.EmailUnableToSend, "Scheduled Worker Thread failed.", e );
fe.Log();
}
finally {
emailTimer.Change( EmailInterval, EmailInterval );
}
}
事實上,程式碼:emailTimer.Change( System.Threading.Timeout.Infinite, EmailInterval );
不夠強壯,理論上講,如果在執行中出錯,會執行:
finally {
emailTimer.Change( EmailInterval, EmailInterval );
}
但,事實上,如果是資料庫伺服器重啟,則可以讓timer線程永遠死掉。
手動解決方法: 重新啟動這個web app
或改寫程式碼:emailTimer.Change( System.Threading.Timeout.Infinite, EmailInterval );
為:emailTimer.Change( EmailInterval * 2, EmailInterval );
可以解決
其他參考:
msdn:
System.Theading.Timer.Change API: