¨ Если задать Action без параметра шаблона, то это будет соответствовать сигнатуре void ЛюбоеИмяФункции().
Теперь вы спокойно можете отлаживать 2-поточное приложение. Проверьте: удалите папку Data, поставьте точки останова в тело AddItem, затем нажмите F5, дождитесь останова и выполните несколько операторов в пошаговом режиме (F10).
Если у вас нет точек останова, то нет смысла запускать приложение в режиме отладки. Смысл есть только тогда, когда вы ожидаете беду (malfunction). Некоторые студенты отвечают: "Я всегда ожидаю беду" (это разумно, но не всегда).
Если не работать в режиме отладки, то можно обойтись без вызова Invoke. Разработчики приложения WMICreator (ищите в Internet) именно так и поступают.
В данный момент наш элемент управления WMIControl должен с помощью элемента treeNS отображать дерево пространств имен WMI. Добейтесь, чтобы это было так. Для проверки алгоритмов работы с деревом удалите папку Data (если она существует), она должна быть вновь создана нашим кодом. Каждый второй и все последующие запуски приложения должны читать информацию о дереве из файла (не опрашивать базу данных WMI).
Теперь приступим к разработке реакции на выбор одного из пространств имен в дереве treeNS. Для каждого выбранного пользователем пространства имен (событие AfterSelect) мы собираемся получить множество классов, которое в нем обитает. Так как это множество может быть большим (тысячи классов), то неплохо бы разбить его на какие-то категории и отобразить в виде дерева. Для этой цели уже имеется элемент TreeView по имени treeClasses.
В теле обработчика события AfterSelect надо обратиться к базе данных WMI и указать в запросе:
¨ Выбранное пользователем имя пространства имен,
¨ Запрашиваемую сущность. Судя по документации, это "meta_class",
У каждого из найденных классов надо выявить значение свойства "__CLASS", которое является искомым именем класса WMI. Множество имен классов следует рассортировать на категории и поместить в дерево treeClasses. Учитывая сказанное, рассмотрите код реакции на событие AfterSelect в дереве treeNS.
void treeNS_AfterSelect(object sender, TreeViewEventArgs e)
{
ClearLists();
treeClasses.Nodes[0].Collapse();
treeClasses.Nodes[0].Nodes.Clear();
treeClasses.BeginUpdate();
lblNumClasses.Text = "Searching...";
treeNS.Enabled = treeClasses.Enabled = false;
string path = e.Node.FullPath; // Выбранное в дереве имя пространства имен
GetClasses(path);
treeNS.Enabled = treeClasses.Enabled = true;
lblNumClasses.Text = nClasses + " classes";
treeClasses.EndUpdate();
treeClasses.Nodes[0].Expand();
lblNamespace.Text = path;
}
void GetClasses(string ns)
{
FormSplash.ShowForm("Searching for WMI Classes... Please, wait");
try
{
ManagementObjectSearcher searcher = new ManagementObjectSearcher(
new ManagementScope(ns),
new SelectQuery("meta_class"), null);
foreach (ManagementClass c in searcher.Get())
{
string name = c["__CLASS"].ToString();
nClasses++;
AddClass(name, c);
FormSplash.AddItem(name);
}
}
catch (Exception e) { SetError(e.Message, ns); }
FormSplash.CloseForm();
}
Алгоритм запроса и обработки его результатов похож на тот, что был использован для пространств имен с той разницей, что результат имеет вид линейной коллекции, а не дерева. В методе AddClass мы попытаемся построить дерево классов путем разбиения полученной коллекции на категории. Отдельно выделяются классы, в свойстве Derivation которых имеется слово "__Event". Другую категорию образуют классы, в множестве описателей которых имеются значения "dynamic" или "static". В документации говорится, что такие классы имеют свойства. Позже вы увидите, что почти все классы имеют свойства, даже те, у которых нет указанных описателей.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.