【问题标题】:App.Current.Shutdown not letting DataSet.WriteXml complete results in corrupt config fileApp.Current.Shutdown 不让 DataSet.WriteXml 完成导致配置文件损坏
【发布时间】:2012-05-19 19:35:46
【问题描述】:

环境 - 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) 的调用完成引起的。

在文件写入磁盘之前,此调用不应该阻止执行吗? ...显然不是!!!

作为一种解决方法,我已经尝试在 App.Current.Shutdown 之前插入 Thread.Sleep(1000) 以创建 1 秒的延迟。但现在有时应用程序会出现“StackOverFlow”异常...!!!

你们会推荐什么作为解决方法或解决方法?我做错了什么?

【问题讨论】:

    标签: c# wpf dataset writexml


    【解决方案1】:

    您无法停止 App.Current.Shutdown

    改为使用 Application.Current.MainWindow.Close()。 这种情况下,你可以在Close事件中拦截,处理你需要处理的,然后调用App.Current.Shutdown

    【讨论】:

      【解决方案2】:

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

      所以而不是:

      myConfigDataSet.WriteXml(myConfigFile)
      

      执行以下操作:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多