2017-04-14 1 views
0

J'essaye d'écrire à mon app.config à partir d'un fil en utilisant Task.Run (() => méthode) mais je reçois une erreur d'E/S sur la ligne 2 dans la méthode ci-dessousErreur d'E/S lors de l'accès à app.config à partir du thread

« System.IO.IOException:« le processus ne peut pas accéder au fichier « WpfApplication1.exe.Config » parce qu'il est utilisé par un autre processus. »

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 Supposons que cela se produise car le thread principal de l'application lit le fichier et empêche le thread d'y accéder. Y a-t-il une manière recommandée de faire ceci?

Répondre

1

Pour travailler avec app.config, vous devez utiliser ConfigurationManager.
Voir exemple ci-dessous:

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"); 
    } 

Mais si le problème est thread différent, vous pouvez utiliser Dispatcher.Invoke.

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

Dans ce cas UpdateCustomConfigSection devrait être invoque dans thread d'interface utilisateur quel que soit l'endroit où la construction Dispatcher.Invoke appelle

+0

Oui J'utilise configurationManager de mettre à jour ma section AppSettings mais comme vous pouvez le voir par mon nom de méthode que je suis essayer de mettre à jour une section personnalisée en dehors d'appSettings. Aussi ... cela fonctionne bien quand je n'essaie pas de l'utiliser à partir d'un fil différent. – ganjeii

+0

Si le problème existe seulement sur le fil différent je peux suggérer utiliser ** Dispatcher.Invoke ** .Tout le code que vous mettez à l'intérieur de Dispatcher.Invoke s'exécutera dans le fil principal wpf UI. [link] (https://msdn.microsoft.com/fr-fr/library/system.windows.threading.dispatcher.invoke (v = vs.110) .aspx) –

+0

J'ai mis à jour la réponse et ajouter un exemple avec Dispatcher.Invoke –