Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Нужна помощь в оптимизации процедуры


Автор: Fedia 9.8.2006, 05:18
Я написал процедуру поиска и удаления подраздела сис. реестра на КПК, содержащего определенный "параметр" = "значению". Только,  скорее всего она жутко не оптимально написана, т.к. поиск данных в подразделе, содержащем ~ 130 др. подразделов у нее занимает около 20 секунд. Прошу помочь оптимизировать эту процедуру.
Код

        public void FindAndDelSubKey(string SubKeyStart, string SubKey,
            string ValueNames, string Value)
        {
            RegistryKey RegKey = OpenNETCF.Win32.Registry.ClassesRoot;
            RegKey = RegKey.OpenSubKey(SubKeyStart);        
            string[] ArS = RegKey.GetSubKeyNames();
            int i;
            for (i = RegKey.SubKeyCount-1; i > -1; i--)
            {
                if (ArS[i] == SubKey)
                {
                    RegistryKey RegSubKey = OpenNETCF.Win32.Registry.ClassesRoot;
                    RegSubKey = RegSubKey.OpenSubKey(SubKeyStart + "\\" + SubKey);

                    bool close = false;
                    if (RegSubKey.GetValue(ValueNames) is String)
                    {
                        string s = (String)RegSubKey.GetValue(ValueNames);
                        if (s == Value) 
                        {
                            MessageBoxButtons buttons = MessageBoxButtons.YesNo;
                            DialogResult result;
                            result = System.Windows.Forms.MessageBox.Show("Удалить: " + SubKeyStart + "\\" + SubKey, 
                                "Удаление подраздела", buttons, MessageBoxIcon.Question,
                                MessageBoxDefaultButton.Button1);
                            if (result == DialogResult.Yes)
                            {
                                close = true;
                                RegSubKey.Close();
                                RegKey.DeleteSubKey(SubKey);
                            }
                        }
                    }
                    if (!close)
                    RegSubKey.Close();
                } 
                else
                    FindAndDelSubKey(SubKeyStart + "\\" + RegKey.GetSubKeyNames()[i],
                        SubKey, ValueNames, Value);
            }
            RegKey.Close();
        }


Автор: mr.DUDA 9.8.2006, 10:02
Можно закомментарить всё что внутри if(ArS[i] == SubKey), тогда будет хотя бы понятно, тормозит ли уже когда нашло ключ, либо до того (в GetSubKeyNames).

Автор: ivashkanet 9.8.2006, 10:50
Нашел что тормозит процесс smile 
Цитата(Fedia @  9.8.2006,  05:18 Найти цитируемый пост)
RegKey.GetSubKeyNames()[i]

Зачем повторно искать имя ключа, если они есть у тебя в массиве ArS smile 
Все стало работать намноооооооооого быстрее
P.S. Я бы заменил еще 
Цитата(Fedia @  9.8.2006,  05:18 Найти цитируемый пост)
RegSubKey = RegSubKey.OpenSubKey(SubKeyStart + "\\" + SubKey);

На RegSubKey = RegKey.OpenSubKey(SubKey);
Правда существенной прибавки производительности не заметил  smile 

Автор: Fedia 9.8.2006, 22:57
Цитата(ivashkanet @  9.8.2006,  10:50 Найти цитируемый пост)
Нашел что тормозит процесс  
Цитата(Fedia @  9.8.2006,  05:18 )    
RegKey.GetSubKeyNames()[i]

Блииин ! Какой ты молодец ! Точно ведь. Спасибо большое  smile

Автор: ivashkanet 10.8.2006, 09:31
Приходи еще  smile 
Цитата(Fedia @  9.8.2006,  22:57 Найти цитируемый пост)
 Какой ты молодец !

 smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)