1

私のアプリケーションでは、SQL Server の更新をチェックします (zip ファイルはvarbinary(max)列に格納されます。なぜこのように行われるのかは聞かないでください。それはまさにその通りです)。Timerアプリケーションは30 分ごとに新しいバージョンをチェックしています。

問題は、コンピューターがスリープ状態になり、次のタイマーサイクルの後に再開すると、常に「データベースに接続できませんでした...」というエラーが発生することです。Timerしたがって、システムがスタンバイ状態になったときに単に停止し、ウェイクアップしたときに再開するだけで十分だと思います。

しかし、私はイベントに参加することさえないようですPowerModeChanged(このイベントを実際にデバッグできるとは思わないため、ログを書いて確認しようとしました)。

以下のコードは、私がやろうとしていることを示していますApp.xaml.cs

// System.Threading.Timer not System.Timers
private Timer _updateTimer;

private void App_OnStartup(object sender, StartupEventArgs e)
{
    // Do update check on startup
    ...

    var updateTime = new TimeSpan(0, 30, 0); // 30 Minutes

    // start update checking in 30 minutes and do it every 30 minutes
    _updateTimer = new Timer(UpdateCheck, null, updateTime, updateTime);

    SystemEvents.PowerModeChanged += (o, args) =>
        {
            if (args.Mode == PowerModes.Suspend)
                _updateTimer.Dispose();
            else if (args.Mode == PowerModes.Resume)
                _updateTimer = new Timer( ... );
        };
}

private void UpdateCheck(object state)
{
    if (Settings.Default.AutoUpdate && UpdateAvailable()) {
        if (MessageBox.Show( ... ) == MessageBoxResult.Yes)
            DoUpdate();
    }
}

private bool UpdateAvailable() { ... }
private void DoUpdate() { ... }

PowerModeChanged を間違った方法で使用していますか? それとも、このアプローチは最善のアイデアではありませんか?

4

1 に答える 1

0

try catch を使用して、エラーが発生した例外をキャッチできます。コンピューターがスリープ状態になると、例外がスローされ、プログラムがそれをキャッチします。プログラムは停止せず、何度もループします。コンピュータが再開すると、通常どおり動作し始めます。

于 2013-10-28T13:22:50.203 に答える