2010-01-21 3 views
2

Я делаю запрос для всех пользователей на машине, и когда он выполняет его, он захватывает 100% процессор и блокирует систему. Я ждал до 5 минут, и ничего не происходит.SelectQuery ест 100% CPU

В диспетчере задач wmiprvse.exe использует весь процессор. Когда я убиваю этот процесс, все возвращается в норму.

Вот мой код:

 SelectQuery query = new SelectQuery("Win32_UserAccount", 
      "LocalAccount=1 and Domain='" + GetMachine().DomainName + "'"); 
     using(ManagementObjectSearcher searcher = new ManagementObjectSearcher(query)) { 
      IList<WindowsUser> users = new List<WindowsUser>(); 
      Console.WriteLine("Getting users..."); 
      foreach (ManagementObject envVar in searcher.Get()) { 
       Console.WriteLine("Getting " + envVar["Name"].ToString() + "..."); 
      } 
     } 

В консоли я вижу это Getting пользователей ... и больше ничего. Проблема связана с поиском.Get().

Кто-нибудь знает, почему этот запрос принимает 100% -ный процессор? Благодарю.

EDIT: OK Я обнаружил, что процесс WMI использует только 25% процессор, но он не освобождается, если я заканчиваю программу (запрос никогда не заканчивается). В следующий раз, когда я начну экземпляр, процесс дойдет до 50% CPU и т. Д. И т. Д., Пока он не достигнет 100%.

Итак, мой новый вопрос - почему процессор не освобождается и как долго должен выполняться такой запрос?

+0

Обычно, если запрос принимает очень много времени, чтобы вернуться, или не возвращаются вовсе, это происходит из-за неправильного условия соединения. Я не очень хорошо знаком с .NET, поэтому я не уверен, как выглядит ваш фактический запрос в SQL. – amischiefr

+0

Ahh, я удалил свои условия и выполнил запрос так, чтобы он был. Если вы опубликуете это как ответ, я могу дать вам кредит. Благодаря! – modernzombie

+0

Ну, это не похоже на большой ответ, поэтому я сделал комментарий. Я не очень беспокоюсь о репутации, просто пытаюсь помочь, но спасибо. – amischiefr

ответ

0

Попробуйте

SelectQuery query = new SelectQuery("Win32_UserAccount", "LocalAccount=1 and Domain='" + GetMachine().DomainName + "'"); 
using(ManagementObjectSearcher searcher = new ManagementObjectSearcher(query)) { 
    IList<WindowsUser> users = new List<WindowsUser>(); 
    Console.WriteLine("Getting users..."); 
    ManagementObjectCollection myCollection = searcher.Get(); 
    foreach (ManagementObject envVar in MyCollection){ 
    Console.WriteLine("Getting " + envVar["Name"].ToString() + "..."); 
    } 
}