2017-04-14 4 views
0

Task.Run(()=>メソッド)を使用してスレッドからapp.configに書き込もうとしていますが、2行目にIOエラーが発生していますスレッドからapp.configにアクセスする際の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); 
     } 

Iメインのアプリケーションスレッドがファイルから読み取りを行い、スレッドがスレッドにアクセスするのをブロックしているため、これが起こっているとします。これを行うための推奨される方法はありますか?

答えて

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を使用することができます。 UpdateCustomConfigSectionにかかわらずDispatcher.Invoke建設はい、私は私のAppSettingsセクションを更新するconfigurationManagerのを使用していますが、あなたは私のメソッド名で見ることができるように私は

+0

呼び出し、どこのUIスレッドで呼び出すべきである。この場合

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

appSettingsの外でカスタムセクションを更新しようとしています。また...これは別のスレッドから使​​用しようとしていないときにうまく動作します。 – ganjeii

+0

問題が別のスレッドのみに存在する場合は、使用することをお勧めします ** Dispatcher.Invoke ** 。Dispatcher.Invoke内に配置したすべてのコードは、メインUIのwpfスレッドで実行されます。 [リンク](https://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcher.invoke(v = vs.110).aspx) –

+0

Dispatcher.Invokeで回答を更新して例を追加しました。 –

関連する問題