2012-11-14 6 views
6

Ich schreibe ein Dienstprogramm, das eine Liste aller Registrierungswerte in HKCR erstellen muss. Ich tue dies eine rekursive Funktion:Schnelle Möglichkeit, alle Registrierungswerte zu lesen

var list = new Dictionary<string, string>(); 
Read(Registry.ClassesRoot, list); 

static void Read(RegistryKey root, IDictionary<string, string> values) 
{ 
    foreach (var child in root.GetSubKeyNames()) 
    { 
     using (var childKey = root.OpenSubKey(child)) 
     { 
      Read(childKey, values); 
     } 
    }    

    foreach (var value in root.GetValueNames()) 
    { 
     values.Add(string.Format("{0}\\{1}", root, value), (root.GetValue(value) ?? "").ToString()); 
    } 
} 

Dies funktioniert gut, aber es dauert ein gutes Stück Zeit (20 Sekunden auf meinem PC). Gibt es einen schnelleren Weg, oder ist das so gut wie es geht?

+2

Es dauert nur 7 Sekunden, um es in einer Datei unter regedit auf meiner hübschen * neuen * Installation zu exportieren. Ich bin mir ziemlich sicher, dass dies meistens nur die Registrierungsgeschwindigkeit ist oder dass es viele Einträge gibt. Wie groß ist das Wörterbuch? –

+1

Während ich nicht weiß, welche Auswirkungen oder Parallelitätseinschränkungen das Lesen aus der Registry haben könnte, könnten Sie versuchen, das Dictionary in ein ConcurrentDictionary und dann Parallel in Ihre foreach-Schleife zu wechseln, um zu sehen, ob Sie das beschleunigen. Natürlich wäre das eine Verschwendung, wenn Sie nicht auf einem Multi-Core-Rechner laufen. –

+0

@JonSkeet 150.000 Einträge. –

Antwort

1

Es gibt viele Informationen in der Registrierung und wie andere hier angemerkt haben - Geschwindigkeit kann ein Problem sein. Wenn Sie möchten, dass eine Liste von Registrierungseinstellungen in einer baumartigen Ansicht für den Benutzer angezeigt wird, ist es möglicherweise eine bessere Lösung, zuerst die Einträge auf oberster Ebene zu durchsuchen und dann den Benutzer zu durchsuchen untergeordnete Werte/Einstellungen, wenn der Baumknoten geöffnet wird.

Ich vermute, das ist, wie Microsofts Regedit funktioniert.

Verwandte Themen