2012-05-19 46 views
0

環境完整的結果 - C#,.NET 4.0,WPF,VS2010App.Current.Shutdown不讓DataSet.WriteXml腐敗配置文件

我有一個使用鍵盤鉤子來檢測應用程序時的四個組合鍵被按下。當發生這種情況時,它調用Configuration.Save(),它調用myConfigDataSet.WriteXml(myConfigFile)。然後在下一行調用App.Current.Shutdown()。

大約一半的時間按預期工作。但很多時候,它會將XML內容直接插入到先前存在的配置文件的中間,導致數據損壞。

我能夠通過解決上述問題...

如果(File.Exists(myConfigFile)){File.Delete(myConfigFile)}

...就行正上方調用myConfigDataSet.WriteXml(myConfigFile)

但現在很多時候它只是寫一個0KB大小的文件。我非常確定,我的所有問題都是由App.Current.Shutdown()引起的,而不是等待myConfigDataSet.WriteXml(myConfigFile)的調用完成。

在文件寫入磁盤之前,這個調用是否應該阻止執行? ...顯然不是!!!

作爲一種解決方法,我已經嘗試插入Thread.Sleep(1000)在App.Current.Shutdown之前創建1秒的延遲。但現在有時應用程序錯誤與「StackOverFlow」例外...... !!!

你們會推薦作爲解決方法或解決方法嗎?我究竟做錯了什麼?

回答

0

你不能停止App.Current.Shutdown

改用Application.Current.MainWindow.Close()。 在這種情況下,您可以在Close事件中攔截,處理您需要處理的內容,然後您可以調用App.Current.Shutdown

0

您可以嘗試將對myConfigDataSet.WriteXml(myConfigFile)的調用放入嘗試/最後阻止。即使線程被中止,finally塊也會被完全執行(請參閱here)。不知道它是否適用於App.Current.Shutdown。

所以不是:

myConfigDataSet.WriteXml(myConfigFile) 

執行以下操作:

try { 
    // Empty... 
} finally { 
    myConfigDataSet.WriteXml(myConfigFile) 
}