Question

Y at-il une méthode facile d'accès aux données de configuration à base System.Configuration sur mesure via une interface thread-safe sans nécessiter chaque contexte d'exécution à partir des informations de configuration de chargement / rechargement qui serait informatiquement lourde?

classes System.Configuration, comme la plupart (tous?) D'autres classes dans la documentation de la bibliothèque .Net de Microsoft, sont annotés avec les informations fil de sécurité suivantes:

  

Tout public static (Shared en Visual Basic) de ce type sont thread-safe.   Tous les membres d'instance ne sont pas garantis comme sûrs.

Par ma lecture de ce fait, les objets retournés ConfigurationSection du ConfigurationManager.GetSection(string) et d'autres méthodes similaires (par exemple OpenExeConfiguration(string exePath).GetSection(string)) ne doivent pas être considérés comme thread-safe et ne devraient donc pas être utilisé par plusieurs contextes d'exécution. Ceci interdit le stockage d'un ConfigurationSection dans un singleton qui serait par ailleurs thread-safe, car alors que l'accès à l'objet de la section peut être en sécurité, les membres de l'objet lui-même ne sont pas sûrs.

Plusieurs appels à GetSection, cependant, sont susceptibles de nécessiter une nouvelle analyse des fichiers de configuration et en allouant de nouvelles instances de ConfigurationSection qui a une tête élevé compte tenu de la configuration ne sera vraisemblablement jamais changer après l'initialisation. En outre, la copie des données de configuration dans un autre objet qui a été fait thread-safe semble vaincre l'un des principaux avantages de l'utilisation du logiciel de configuration intégré en premier lieu (accès facile à configuration de type convertie et validé des informations sans beaucoup de passe-partout code).

Alors, est-il un moyen d'utiliser System.Configuration de manière thread-safe sans avoir recours à l'analyse syntaxique en excès et les allocations des sections de configuration? Est-ce que la mise en œuvre de votre propre ConfigurationSection vous libérer de l'absence de garantie fournie par Microsoft, même si vous accédez à travers les interfaces System.Configuration (et si oui, comment voulez-vous mettre en œuvre pour être thread-safe lorsque l'accès à l'indexeur de la base ConfigurationSection est nécessaire pour accéder aux données configuré)?

Était-ce utile?

La solution

L'instance de retour GetSection n'est pas thread-safe. Cela signifie que vous devez ajouter le code de verrouillage afin de l'utiliser dans votre singleton.

Plusieurs appels ne sont pas réanalysera le fichier, sauf si le fichier a changé. Les données sont mises en mémoire cache.

Votre problème de sécurité de fil est facilement résolu en utilisant le verrouillage (je ne suis pas sûr que vous aurez besoin, à moins que vous changez la configuration lors de l'exécution), et il n'y a pas de problème de performance.

Autres conseils

ConfigurationManager.GetSection (string) est membre statique public et depuis msdn déclare 'Tous les membres static (Shared dans Visual Basic) de ce type sont thread-safe', vous pouvez supposer qu'il est sûr à utiliser.

En ce qui concerne la performance, je serais prêt à supposer que MS a fait assez efficace déjà et il suffit d'utiliser leurs fonctions comme il est. Rappelez-vous:. Optimisation prématurée est la racine du mal

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top