とりわけ、24 時間ごとにデータベースのメンテナンスを行う必要がある Windows サービスがあります。(SQL Express のため、データベース内でスケジュールすることはできません)
このために、データベース メンテナンス メソッドへのコールバックを使用してタイマーを作成しましたが、1 回しかヒットしないように見えます (タイマーの作成時と思われます)。これは、タイマー自体が範囲外になり、GC されたためだと思いましたが、私が試した解決策はどれも機能していないようです
サービスの基本的なレイアウトは次のとおりです。
WindowsService.cs:
protected override void OnStart(string[] args)
{
ThreadPool.QueueUserWorkItem(StartServices);
}
private void StartServices() { Manager.Start(); }
Manager.cs:
public class Manager
{
private static Timer MaintenanceTimer;
public static void Start()
{
MaintenanceTimer = new Timer(DoMaintenance);
MaintenanceTimer.Change(new TimeSpan(0), new TimeSpan(24,0,0,0)); //I use 1 minute for testing
}
}
明らかに、このコードは大幅に単純化されていますが、これが実際に起こっていることです。前に述べたように、GC が問題であると考えているため、次の 2 つのことを試してみました。
- コンストラクター Timer(callback) を使用して、コールバックへの自己参照を提供します。ただし、これでもスコープの不足を防ぐことはできないため、それはできません。
- タイマーを Manager クラス内の静的変数として定義します。これにより、GC されることはなくなりますが、それでも 24 時間ごとに呼び出されるようには見えません。
この問題の助けをいただければ幸いです