1

環境 - C#、.NET 4.0、WPF、VS2010

キーボードフックを使用して、4 つのキーの組み合わせが押されたことを検出するアプリがあります。これが発生すると、myConfigDataSet.WriteXml(myConfigFile) への呼び出しを持つ Configuration.Save() が呼び出されます。そして、次の行で App.Current.Shutdown() を呼び出します。

約半分の時間で、期待どおりに動作します。しかし、多くの場合、既存の構成ファイルの途中に XML コンテンツが挿入され、結果としてデータが破損していました。

を使用して上記の問題を修正できました...

if(File.Exists(myConfigFile)) { File.Delete(myConfigFile) }

... myConfigDataSet.WriteXml(myConfigFile) への呼び出しのすぐ上の行

しかし、今では多くの場合、0KB サイズのファイルを書き込むだけです。私の問題はすべて、 App.Current.Shutdown() が myConfigDataSet.WriteXml(myConfigFile) の呼び出しが完了するのを待っていないことが原因であると確信しています。

ファイルがディスクに書き込まれるまで、この呼び出しは実行をブロックすべきではありませんか? ...どうやらそうではありません!!!

回避策として、App.Current.Shutdown の直前に Thread.Sleep(1000) を挿入して 1 秒の遅延を作成しようとしました。しかし、今ではアプリが「StackOverFlow」例外でエラーになることがあります...!!!

これに対する修正または回避策として何をお勧めしますか? 私は何を間違っていますか?

4

2 に答える 2

0

myConfigDataSet.WriteXml(myConfigFile) への呼び出しを try/finally ブロックに入れてみることができます。スレッドが中止された場合でも、finally ブロックは完全に実行されます (こちらを参照)。ただし、 App.Current.Shutdown で動作するかどうかはわかりません。

したがって、代わりに:

myConfigDataSet.WriteXml(myConfigFile)

以下をせよ:

try {
    // Empty...
} finally {
    myConfigDataSet.WriteXml(myConfigFile)
}
于 2012-05-21T11:20:27.410 に答える
0

App.Current.Shutdown を停止することはできません

代わりに、Application.Current.MainWindow.Close() を使用してください。この場合、Close イベントでインターセプトし、処理する必要があるものを処理してから、App.Current.Shutdown を呼び出すことができます。

于 2012-05-19T22:01:19.203 に答える