asp.net forums2やcsシステムでは数分ごとにメールが送信されますが、これを実行するとデータベースサーバーが再起動します。
電子メール送信スレッドが停止します。
参照コード:
private void ScheduledWorkCallbackEmailInterval (オブジェクト送信者)
{
試す {
// メールの処理中はタイマーを一時停止します
emailTimer.Change( System.Threading.Timeout.Infinite, EmailInterval );
// メールを送信する
//
Emails.SendQueuedEmails( (HttpContext) 送信者);
//匿名ユーザーを更新します
//
Users.UpdateAnonymousUsers
( (HttpContext) 送信者);
catch(例外 e) {
ForumException fe = new ForumException( ForumExceptionType.EmailUnableToSend, "スケジュールされたワーカー スレッドが失敗しました。", e );
fe.Log();
}
ついに {
emailTimer.Change( EmailInterval, EmailInterval );
}
}
実際、コード emailTimer.Change(System.Threading.Timeout.Infinite, EmailInterval) は、
理論
上、実行中にエラーが発生した場合に実行されます。
emailTimer.Change( EmailInterval, EmailInterval );
}
しかし、実際には、データベース サーバーが再起動されると、タイマー スレッドが永久に停止する可能性があります。
手動による解決策: Web アプリを再起動する
か、コードを emailTimer.Change( System.Threading.Timeout.Infinite, EmailInterval )
に書き換えます。 emailTimer.Change( EmailInterval * 2, EmailInterval )
;
その他の参照:
msdn:
System.THeading.Timer.Change API: