90 日前のメールを毎晩アーカイブする必要がある機能があります。これを処理するクラスを作成しました。例を次に示します。
public void processArchives()
{
initializeTimer();
}
private void initializeTimer()
{
var now = DateTime.Now;
var tomorrow = now.AddDays(1);
var durationUntilMidnight = tomorrow.Date - now;
var t = new Timer(o => { attemptArchivalProcess(); }, null, TimeSpan.Zero, durationUntilMidnight);
}
private void attemptArchivalProcess()
{
//perform archival
initializeTimer(); //re-start timer to process tomorrow
}
問題は、initializeTimer を繰り返し呼び出すと、スタック オーバーフロー (関数呼び出しの繰り返し) が発生するか、それとも「永久に」正常に実行されるかということです。
processArchives() を新しいスレッドとして呼び出し、スレッドを開いたままにするか、init 呼び出しの後に次のようなループが必要ですか。
while(!Program.Closing){ sleep(...); }
ガベージコレクションされないようにするには?