2011-08-03 5 views
1

안녕하세요, 도메인 (잠재적으로 수천)의 각 시스템에 WMI 쿼리를 보내야하고 WMI 쿼리가 돌아 오는 데 시간이 오래 걸리는 것 같습니다. 그래서 여러 스레드를 사용하여 여러 요청을 보내는 최상의 방법을 검토 중이므로 프로세스가 백그라운드에서 실행될 수 있고 호출이 겹칠 수 있습니다.다중 스레드 WMI 호출 -이를 어떻게 처리해야합니까?

BackgroundWorker가 제공하는 기능이 마음에 들며 덮개 아래 ThreadPool을 사용하는 HERE을 읽습니다. 나는 나의 목적을 달성하기 위해 이것을 어떻게 활용할 지 알지 못한다. 1000 개의 쿼리를 보내야한다면 루프마다 각 쿼리에 대해 새로운 BG 작업자를 호출 할 수 있으며 스레드 풀은 한 번에 최대 25 개의 스레드 (?)를 사용하며 나머지 975 개의 요청은 다음과 같습니다. 대기 중. 그게 무슨 일 이니?

이것이 맞다면 1000 개의 요청을 큐에 저장하는 프로세스 자체가 UI를 고정 시키므로 큐잉 루프 자체가 다른 BG 작업자에서 실행되어야한다고 생각합니까?

작업자 스레드에서 다른 작업자 스레드를 호출 할 때 문제가 있습니까?

20 개의 BG 작업자 스레드 만 만들고 하나가 완료되면 수동으로 다른 스레드를 시작해야합니까?

이 권리를 이해하고 있습니까? 어떤 조언을 많이 주시면 감사하겠습니다!

답변

3

System.Threading.Tasks 네임 스페이스에있는 Parallel.ForEach 메서드를 사용합니다.

목록 만들기 쿼리 할 모든 호스트 이름이 포함 된 문자열 <을 작성하십시오. 그런 다음 문자열을 입력으로 가져 와서 쿼리하고 해당 데이터로 수행하고자하는 모든 작업을 수행하는 메서드를 만듭니다.

Parallel.ForEach(ComputerList, QueryAComputer); 

처럼 foreach는 방법에 넣어 그것을 찢어 수 있습니다. 필요없는 즉시 ManagementObjects에서 Dispose() 메서드를 호출해야합니다. 한 번에 너무 많은 쿼리를 수행 할 때 WMI가 중단되는 문제가 있다고 생각합니다. Dispose()는 이러한 리소스를 해제하고 교착 상태를 방지하는 데 도움이됩니다.

+0

매우 유용한 팁, 고마워, 나는 이것을 줄 것이다! – TripleAntigen