データベースにたくさんのものを書き込んでいるWindowsフォームアプリケーションがあります。少し前に、Windowsフォームが閉じられる前にすべてのリクエスト(データベースへの書き込み)が完了したことを確認する方法の解決策を求めていました。
私がこれを行っている理由は、それが自動シャットダウンを備えた自立型アプリケーションになるためです。したがって、データベースからの書き込みと読み取りをすべて終了し、フォームを閉じるときにすべての仕事が終わりました。
この解決策を試す前に、フォームを閉じるためにデータベースに書き込むときに接続を切断するという問題がありました。
ここでの問題は、プロセスをシャットダウンすると、Windowsフォームアプリケーションが閉じないため、しばらくすると、必要のない電力がカットされることです。
これがコードです。何が問題なのか教えてください。プログラムがバックグラウンドで動作しているタスクがないことを確認したら、フォームを閉じる必要があります。
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
// this.Visible = false; // optional
// this.ShowInTaskbar = false; // optional
Task db = Task.Factory.StartNew(() => DBUpdate());
Task.WaitAll(db);
if (this.shutdownRequested)
Process.Start("shutdown.exe", "-s");
}
protected override void WndProc(ref Message ex)
{
if (ex.Msg == WM_QUERYENDSESSION)
{
Message MyMsg = new Message() { Msg = WM_CANCELMODE };
base.WndProc(ref MyMsg);
this.shutdownRequested = true;
} else {
base.WndProc(ref ex);
}
}
編集:
Xボタンをクリックしてフォームが閉じ始めるとこれが機能していることに気付きましたが、PCがシャットダウンフェーズに入ると機能しません。何か案が?FormClosing ではなく、何か別のイベントを変更する必要があるのではないでしょうか? もう一つ。申請プロセスの優先度をリアルタイムプロセスとして保存しました。