Domanda

Esiste un metodo semplice per accedere ai dati di configurazione personalizzata System.Configuration e mediante un interfaccia thread-safe senza richiedere ogni contesto di esecuzione da carico / ricarico informazioni di configurazione che sarebbe computazionalmente gravoso?

classi System.Configuration, come la maggior parte (tutte?) Le altre classi di documentazione della libreria di Microsoft .Net, sono annotati con le seguenti informazioni filo di sicurezza:

  

statici pubblici (in Visual Basic) di questo tipo è thread-safe.   I membri di istanza non sono garantiti per essere thread-safe.

Con la lettura di questo, gli oggetti ConfigurationSection restituiti dal ConfigurationManager.GetSection(string) e altri metodi simili (per esempio OpenExeConfiguration(string exePath).GetSection(string)) non devono essere considerate thread-safe e quindi non deve essere utilizzato da diversi contesti di esecuzione. Questo impedisce la memorizzazione di un ConfigurationSection in un singoletto che altrimenti essere thread-safe perché mentre l'accesso all'oggetto sezione può essere sicuro, i membri sull'oggetto stesso non sono sicuri.

Chiamate multiple a GetSection, tuttavia, è probabile che richiedono una nuova analisi dei file di configurazione e assegnazione di nuove istanze ConfigurationSection che ha un alto testa considerando la configurazione non è destinata a cambiare per sempre l'inizializzazione. Inoltre, la copia dei dati di configurazione in un altro oggetto che è stato fatto thread-safe sembra per sconfiggere uno dei principali vantaggi di utilizzare il pacchetto di progettazione integrata, in primo luogo (un facile accesso al tipo-convertito e validato le informazioni di configurazione senza molto boilerplate codice).

Quindi, c'è un modo per utilizzare System.Configuration in modo thread-safe senza ricorrere ad un eccesso di analisi e assegnazioni di sezioni di configurazione? Fa attuare il proprio ConfigurationSection liberano dal mancanza di garanzia fornita da Microsoft, anche se si sta accedendo attraverso le interfacce System.Configuration (e se sì, come si potrebbe implementare per essere thread-safe quando è richiesto l'accesso al indicizzatore del ConfigurationSection di base per l'accesso ai dati configurato)?

È stato utile?

Soluzione

L'istanza restituita dal GetSection non è thread-safe. Ciò significa che è necessario aggiungere il codice di blocco al fine di utilizzare nel vostro Singleton.

Chiamate multiple non ri-analizzare il file, a meno che il file è stato modificato. I dati vengono memorizzati nella cache in memoria.

Il problema di sicurezza filo è facilmente risolvibile utilizzando bloccaggio (non sono sicuro che è necessario, a meno che non si modifica la configurazione in fase di esecuzione), e non v'è alcun problema di prestazioni.

Altri suggerimenti

ConfigurationManager.GetSection (stringa) è un membro statico pubblico, e dal momento che MSDN afferma 'statici pubblici (Shared in Visual Basic) di questo tipo sono thread-safe', si può assumere che è sicuro da usare.

Per quanto riguarda le prestazioni, sarei disposto ad assumere che la SM ha reso abbastanza efficiente già e basta usare le loro funzioni come è. Ricorda:. Ottimizzazione prematura è la radice del male

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top