1

とりわけ、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 時間ごとに呼び出されるようには見えません。

この問題の助けをいただければ幸いです

4

2 に答える 2

0

結局、私は問題を解決する通常のSystem.Timers.Timerを使用しました。ただし、System.Threading.Timerのどこが間違っていたのかはまだわかりません。

于 2013-02-25T10:34:27.757 に答える
0

SQL ServerExpressではSQLServerエージェントを使用できないため、最善の解決策は、SQLスクリプトを作成し、それをスケジュールされたタスクとして実行することです。

確認と管理が簡単です。バックアップのスケジュール/保持に合わせて、複数のスケジュールされたタスクを設定できます。

スケジュールされたタスクで使用するコマンドは次のとおりです。

C:\Program Files\Microsoft SQL Server\90\Tools\Binn\SQLCMD.EXE" -i"c:\path\to\sqlbackupScript.sql
于 2013-02-25T10:35:34.537 に答える