环境 - C#,. NET 4.0,WPF,VS2010
我有一个应用程序使用键盘钩来检测何时按下四个键的组合。发生这种情况时,它调用Configuration.Save(),它调用myConfigDataSet.WriteXml(myConfigFile)。然后在下一行调用App.Current.Shutdown()。
大约一半时间按预期工作。但很多时候它会将XML内容直接插入到先前存在的配置文件的中间,从而导致数据损坏。
我能够通过使用...来解决上述问题。
if(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 :(得分:0)
您无法停止App.Current.Shutdown
而是使用Application.Current.MainWindow.Close()。 在这种情况下,您可以截取Close事件,处理您需要处理的内容,然后您可以调用App.Current.Shutdown
答案 1 :(得分:0)
您可以尝试在try / finally块中调用myConfigDataSet.WriteXml(myConfigFile)。即使线程被中止,finally块也会被完全执行(参见here)。不确定它是否适用于App.Current.Shutdown。
所以而不是:
myConfigDataSet.WriteXml(myConfigFile)
执行以下操作:
try {
// Empty...
} finally {
myConfigDataSet.WriteXml(myConfigFile)
}