Frage

Gibt es eine einfache Methode für den Zugriff benutzerdefinierte System.Configuration-basierten Konfigurationsdaten über eine Thread-sichere Schnittstelle, ohne dass jeden Ausführungskontext von Laden / Neuladen von Konfigurationsinformationen, die rechentechnisch aufwendig sein würden?

System.Configuration Klassen, wie die meisten (alle?) Andere Klassen in Microsoft .NET-Bibliothek Dokumentation, werden mit den folgenden Thread-Sicherheit Informationen versehen:

  

Alle öffentlichen static (Shared in Visual Basic) Member dieses Typs sind threadsicher.   Für Instanzelemente sind nicht auf die Threadsicherheit gewährleistet.

Durch meine Lektüre dieser kehrten die ConfigurationSection Objekte aus dem ConfigurationManager.GetSection(string) und anderen ähnlichen Verfahren (z OpenExeConfiguration(string exePath).GetSection(string)) dürfen nicht davon ausgegangen werden Thread-sicher sein und somit nicht von mehreren Ausführungskontexten verwendet werden soll. Dies verbietet eine ConfigurationSection in Singleton zu speichern, die sonst Thread-sicher sein würde, weil während der Zugriff auf den Bereich Objekt sicher sein können, die Mitglieder auf das Objekt selbst nicht sicher sind.

Mehrere Anrufe zu GetSection sind jedoch wahrscheinlich wieder Parsen der Konfigurationsdateien und die Zuweisung neuer ConfigurationSection Instanzen verlangen, die einen hohen Aufwand in Anbetracht der Konfiguration ist nicht wahrscheinlich, je nach der Initialisierung ändern. Ferner Kopieren der Konfigurationsdaten in ein anderes Objekt, das Thread-sicher gemacht wurde scheint in erster Linie für die Verwendung des integrierten Konfigurationspaketes eine der wichtigsten Vorteile zu besiegen (einfacher Zugang zu typ konvertiert und validiert Konfigurationsinformationen ohne viele vorformulierten Code).

So ist es eine Möglichkeit, System.Configuration in einem Thread-sichere Art und Weise zu verwenden, ohne um überschüssiges Parsing und Zuweisungen von Konfigurationsabschnitten zurückgreifen? Gibt es in Ihrem eigenen ConfigurationSection Implementierung Sie aus dem Mangel an durch Microsoft selbst bereitgestellte Garantie kostenlos wenn Sie es durch die System.Configuration Schnittstellen sind den Zugriff auf (und wenn ja, wie würden Sie es Thread-sicher, wenn der Zugriff auf die Basis ConfigurationSection Indexer implementieren erforderlich ist für den konfigurierten Datenzugriff)?

War es hilfreich?

Lösung

Die Instanz von GetSection zurückgegeben wird, ist nicht Thread-sicher. Das heißt, Sie Sperrcode hinzuzufügen, um es brauchen in Ihrem Singleton zu verwenden.

Mehrere Anrufe nicht erneut analysieren, um die Datei, es sei denn, die Datei geändert hat. Die Daten werden im Arbeitsspeicher zwischengespeichert.

Ihr Thread Sicherheitsproblem wird durch die Verwendung Verriegelung (Ich bin nicht sicher, Sie werden müssen, es sei denn, Sie die Konfiguration zur Laufzeit sind zu ändern) leicht gelöst, und es gibt kein Performance-Problem.

Andere Tipps

ConfigurationManager.GetSection (string) ist ein öffentliches statisches Element, und da Msdn ‚Alle öffentlichen (Shared in Visual Basic) Member dieses Typs Thread-sicher sind‘, heißt es, können Sie davon ausgehen, es ist sicher zu verwenden.

Was die Leistung, ich würde bereit sein, anzunehmen, dass MS es ziemlich effizient schon gemacht hat und nur ihre Funktionen wie. Denken Sie daran:. Vorzeitige Optimierung ist die Wurzel des Übels

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top