2012-08-28 37 views
7

我有一個使用ManagementObjectSearcher的WMI查詢。WMI ManagementObjectSearcher掛在查詢

通常情況下,這個工作正常,但在一些機器上,它是懸掛/從不返回。我試着在查詢上設置超時,但似乎沒有任何區別。

這是我的代碼:

using (var query = new ManagementObjectSearcher("SELECT IDProcess, PercentProcessorTime, WorkingSet FROM Win32_PerfFormattedData_PerfProc_Process")) 
{ 
    try 
    { 
     query.Options.Timeout = new TimeSpan(0, 0, 10); 
     query.Options.ReturnImmediately = false; 
     Log.Info("Query built"); 
     foreach (ManagementObject obj in query.Get()) 
     { 
      using (obj) 
      { 
       var key = (uint)obj.GetPropertyValue("IDProcess"); 
       Log.Info(key); 
       processStats[key] = new ulong[] { (ulong)obj.GetPropertyValue("PercentProcessorTime"), (ulong)obj.GetPropertyValue("WorkingSet") }; 
      } 
     } 
    } 
} 

在我的日誌,我看到了「建立查詢」,再沒有什麼,程序無響應。

我試過了,沒有手動超時設置。

回答

-3

應該沒有「使用」

var query = new ManagementObjectSearcher("SELECT IDProcess, PercentProcessorTime, WorkingSet FROM Win32_PerfFormattedData_PerfProc_Process"); 
try 
{ 
    query.Options.Timeout = new TimeSpan(0, 0, 10); 
    query.Options.ReturnImmediately = false; 
    log.Info("Query built"); 
    foreach (ManagementObject obj in query.Get()) 
    { 
     using (obj) 
     { 
      var key = (uint)obj.GetPropertyValue("IDProcess"); 
      Log.Info(key); 
      processStats[key] = new ulong[] { (ulong)obj.GetPropertyValue("PercentProcessorTime"), (ulong)obj.GetPropertyValue("WorkingSet") }; 
     } 
    } 
} 
3

最近我們測試過的WMI查詢在「C#命令行」和WMI和預期一樣,但在WPF重寫後,我們面臨着同樣的問題,你的工作。經過一番研究,我發現如果您在STA(單線程模式)中操作WMI,而在STA模式下操作WPF,那麼執行我們正在使用ThreadPool(重寫您的案例)的任務:

 ThreadPool.QueueUserWorkItem((_) => 
      { 
       using (var query = new ManagementObjectSearcher("SELECT IDProcess, PercentProcessorTime, WorkingSet FROM Win32_PerfFormattedData_PerfProc_Process")) 
       { 
        try 
        { 
         query.Options.Timeout = new TimeSpan(0, 0, 10); 
         query.Options.ReturnImmediately = false; 
         Log.Info("Query built"); 
         foreach (ManagementObject obj in query.Get()) 
         { 
          using (obj) 
          { 
           var key = (uint)obj.GetPropertyValue("IDProcess"); 
           Log.Info(key); 
           processStats[key] = new ulong[] { (ulong)obj.GetPropertyValue("PercentProcessorTime"), (ulong)obj.GetPropertyValue("WorkingSet") }; 
          } 
         } 
        } 
        catch (SystemException) 
        { 
        } 
       } 
      });