从线程访问app.config时出现IO错误

时间:2017-04-14 21:14:13

标签: thread-safety app-config read-write

我正在尝试使用 Task.Run(()=>方法)从线程写入我的app.config但是我在方法的第2行遇到IO错误下面

“System.IO.IOException:'进程无法访问文件'WpfApplication1.exe.Config',因为它正由另一个进程使用。'”

private static void UpdateCustomConfigSection(string sectionName, string key, string val)
        {
            var xmlDoc = new XmlDocument();
            xmlDoc.Load(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile); //Error happens here

            XmlNode selectSingleNode = xmlDoc.SelectSingleNode($"//{sectionName}/add[@key='{key}']");
            if (selectSingleNode != null && selectSingleNode.Attributes != null)
            {
               selectSingleNode.Attributes["value"].Value = val;
            }

            xmlDoc.Save(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile);

            ConfigurationManager.RefreshSection(sectionName);
        }

我认为这种情况正在发生,因为主应用程序线程正在从文件中读取并阻止线程访问它。有推荐的方法吗?

1 个答案:

答案 0 :(得分:1)

要使用app.config,您应该使用ConfigurationManager 见下面的例子:

    private static void UpdateCustomConfigSection(string key, string val)
    {
        Configuration configuration = ConfigurationManager.OpenExeConfiguration(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile);
        configuration.AppSettings.Settings[key].Value = val;
        configuration.Save();
        ConfigurationManager.RefreshSection("appSettings");
    }

但如果问题是不同的话题,你可以使用Dispatcher.Invoke

        Dispatcher.Invoke(() =>
        {
            UpdateCustomConfigSection(sectionName,key, val);
        });

在这种情况下,无论Dispatcher.Invoke构造在何处调用

,都应在UI线程中调用UpdateCustomConfigSection