私のアプリケーションでは、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 を間違った方法で使用していますか? それとも、このアプローチは最善のアイデアではありませんか?