Многопоточные вызовы WMI - как лучше всего справиться с этим? - PullRequest
1 голос
/ 03 августа 2011

Привет! Мне нужно отправить WMI-запрос каждой системе в домене (возможно, тысячам), и WMI-запросы возвращаются очень долго. Поэтому я рассматриваю лучшие способы отправки нескольких запросов с использованием нескольких потоков, чтобы процесс мог выполняться в фоновом режиме, а вызовы могли перекрываться.

Мне нравятся функции, которые предлагает BackgroundWorker, и я читаю ЗДЕСЬ , что он использует ThreadPool под крышками. Я действительно не понимаю, как бы я использовал это для своих целей. Кажется, что если бы мне пришлось отправить 1000 запросов, я мог бы сделать цикл, в котором я вызываю новый BG-работник для каждого запроса, и пул потоков будет использовать до 25 (?) Потоков одновременно, а остальные 975 запросов в очереди. Это то, что происходит?

Если это правильно, я представляю, что процесс постановки в очередь до 1000 запросов сам по себе замораживает пользовательский интерфейс, поэтому должен ли сам цикл очередей выполняться в другом работнике BG?

Есть ли проблема с вызовом других рабочих потоков из рабочего потока?

Должен ли я создавать, скажем, только 20 рабочих потоков BG и вручную запускать другие, когда один из них завершается?

Я правильно понимаю? Любой совет будет высоко ценится!

1 Ответ

3 голосов
/ 09 декабря 2011

Я использую метод Parallel.ForEach, который находится в пространстве имен System.Threading.Tasks.

Создайте список , содержащий все имена хостов, которые вы хотите запросить.Затем создайте метод, который принимает строку в качестве входных данных, запрашивает ее и выполняет все, что вы хотите с этими данными.

Поместите их в метод ForEach, подобный этому

Parallel.ForEach(ComputerList, QueryAComputer);

и пусть это порвется.Обязательно вызовите метод Dispose () для ManagementObjects, как только они вам не понадобятся.Я думаю, что есть какая-то проблема, которая заставляет WMI ломаться, когда слишком много запросов выполняется одновременно.Dispose () должен помочь освободить эти ресурсы и предотвратить взаимоблокировку.

...