ConfigurationManager.AppSettings Preocupări privind performanța

Am de gând să stochez toate setările de configurare în secțiunea app.config a aplicației (folosind clasa ConfigurationManager.AppSettings ). Pe măsură ce utilizatorul modifică setările utilizând interfața de utilizare a aplicației (făcând clic pe casete de selectare, selectând butoane radio etc.), intenționez să scriu acele modificări în AppSettings . În același timp, în timp ce programul se execută, intenționez să accesez constant codul AppSettings dintr-un proces care va procesa în mod constant date. Modificările aduse setărilor prin interfața utilizator trebuie să afecteze procesarea datelor în timp real, motiv pentru care procesul va accesa în mod constant AppSettings în mod constant.

Este o idee bună în ceea ce privește performanța? Folosind AppSettings se presupune că este "calea cea bună" pentru a stoca și a accesa setările de configurare atunci când scrieți aplicații .Net, dar mă tem că această metodă nu a fost destinată încărcării constante (cel puțin setările fiind citite constant).

Dacă cineva are experiență în acest sens, aș aprecia foarte mult contribuția.

Update: I should probably clarify a few points.

Aceasta nu este o aplicație web, astfel încât conectarea unei baze de date cu aplicația ar putea fi depășită doar pentru stocarea setărilor de configurare. Aceasta este o aplicație Windows Forms.

Conform documentației MSDN, ConfigurationManager este pentru stocarea nu numai a setărilor nivelului de aplicație, ci și a setărilor de utilizator. (Este deosebit de important dacă, de exemplu, aplicația este instalată ca o aplicație parțială de încredere.)

Update 2: I accepted lomaxx's answer because Properties does indeed look like a good solution, without having to add any additional layers to my application (such as a database). When using Properties, it already does all the caching that others suggested. This means any changes and subsequent reads are all done in memory, making it extremely fast. Properties only writes the changes to disk when you explicitly tell it to. This means I can make changes to the config settings on-the-fly at run time and then only do a final save out to disk when the program exits.

Doar pentru a verifica că ar fi de fapt capabil să se ocupe de sarcina de care am nevoie, am făcut unele teste pe laptop-ul meu și a fost în măsură să facă 750.000 citiri și 7500 scrie pe secundă, folosind Proprietăți. Este atât de mult peste și dincolo de ceea ce cererea mea vreodată se apropie chiar de necesitatea că mă simt foarte sigur în utilizarea proprietăților fără a afecta performanța.

0
fr hi bn

8 răspunsuri

Aș putea întreba de ce nu salvați setările utilizatorului într-o bază de date?

În general, salvez setările de aplicație care se schimbă foarte rar în secțiunea appSettings (se trimit jurnalele de eroare ale adreselor de e-mail implicite, numărul de minute după care sunteți deconectat automat, etc.) Domeniul de aplicare al acestui lucru este cu adevărat la aplicație , nu la utilizator și este în general utilizat pentru setările de implementare.

0
adăugat

Check out SQLite, se pare că este o opțiune bună pentru acest scenariu.

0
adăugat

Cineva mă corectează dacă greșesc, dar nu cred că AppSettings este de obicei menit să fie folosit pentru aceste tipuri de setări de configurare. În mod normal, ați pune doar setări care rămân destul de statice (șiruri de conexiuni de bază de date, căi de fișiere etc.). Dacă doriți să stocați setări de utilizator personalizabile, ar fi mai bine să creați un fișier de preferințe separat sau să stocați în mod ideal aceste setări într-o bază de date.

0
adăugat

AppSettings nu este cu adevărat menită pentru ceea ce încercați să faceți.

Când aplicația dvs. .NET începe, se citește în fișierul app.config și cache conținutul său în memorie. Din acest motiv, după ce scrieți în fișierul app.config, va trebui să forțați modul de executare pentru a re-analiza fișierul app.config, astfel încât acesta să poată reîncărca din nou setările. Acest lucru nu este necesar

cea mai bună abordare ar fi să utilizați o bază de date pentru a stoca setările de configurare.

Cu restricționarea utilizării unei baze de date, puteți seta cu ușurință un fișier de configurare extern XML. Când aplicația dvs. începe, puteți să-i memorați conținutul într-un obiect NameValueCollection sau obiect HashTable. În timp ce schimbați / adăugați setări, ați face acest lucru la copia cache. Când cererea dvs. se închide sau într-un interval de timp corespunzător, puteți scrie conținutul memoriei cache înapoi în fișier.

0
adăugat

un lucru pe care mi-ar uita de a face este caching appsettings pe o citire, apoi spălare setările din memoria cache de pe scriere, care ar trebui să minimizeze cantitatea de încărcare reală a serverului trebuie să se ocupe cu prelucrarea appSettings.

De asemenea, dacă este posibil, examinați ruperea aplicațiilor în configSections , astfel încât să puteți citi setările legate de scriere și memoria cache.

După ce am spus toate acestea, aș lua în considerare în mod serios uitarea la stocarea acestor valori într-o bază de date, deoarece pare să rețineți, de fapt, preferințele utilizatorului și nu setările aplicației.

0
adăugat

deoarece utilizați o aplicație winforms, dacă este în .net 2.0, de fapt există un sistem de setări pentru utilizatori (numit Proprietăți) care este proiectat în acest scop. Acest articol pe MSDN are o introducere destul de bună în asta

If you're still worried about performance then take a look at SQL Compact Edition which is similar to SQLite but is the Microsoft offering which I've found plays very nicely with winforms and there's even the ability to make it work with Linq

0
adăugat

Nu aș folosi fișierele config pentru stocarea datelor de utilizator. Utilizați un db.

0
adăugat

Dylan,

Nu utilizați fișierul de configurare a aplicației pentru acest scop, utilizați un SQL DB (SQLite, MySQL, MSSQL, indiferent), deoarece va trebui să vă faceți griji mai puțin despre problemele legate de concurrency în timpul citirii și scrierea în fișierul config.

Veți avea, de asemenea, o mai mare flexibilitate în tipul de date pe care doriți să le stocați. Secțiunea appSettings este doar o listă cheie / valoare pe care ați putea să o depășiți odată cu trecerea timpului și după ce aplicația se maturizează. Aveți posibilitatea să utilizați secțiuni de configurări personalizate, dar apoi vă aflați într-o nouă zonă problema când vine vorba de design.

0
adăugat