App.Current.Shutdown 不让 DataSet.WriteXml 完成会导致配置文件损坏

本文关键字:配置文件 损坏 Shutdown Current 不让 DataSet WriteXml App | 更新日期: 2023-09-27 18:34:38

Environment - 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"异常......!!

你们会建议什么作为修复或解决方法?我做错了什么?

App.Current.Shutdown 不让 DataSet.WriteXml 完成会导致配置文件损坏

您无法停止 App.Current.Shutdown

相反,请使用 Application.Current.MainWindow.Close((。在这种情况下,您可以在 Close 事件中截获,处理需要处理的内容,然后可以调用 App.Current.Shutdown

您可以尝试将对 myConfigDataSet.WriteXml(myConfigFile( 的调用放在 try/finally 块中。即使线程中止,finally 块也会完全执行(请参阅此处(。不确定它是否适用于App.Current.Shutdown。

所以代替:

myConfigDataSet.WriteXml(myConfigFile)

执行以下操作:

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