2012-08-28 13 views
7

पर लटक रहा है मेरे पास ManagementObjectSearcher का उपयोग कर एक WMI क्वेरी है।WMI प्रबंधन ऑब्जेक्ट खोजकर्ता क्वेरी

आमतौर पर, यह ठीक काम करता है, लेकिन कुछ मशीनों पर, यह लटक रहा/कभी वापस नहीं आ रहा है। मैंने क्वेरी पर टाइमआउट सेट करने का प्रयास किया है, लेकिन ऐसा कोई फर्क नहीं पड़ता है।

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 प्रश्नों "सी # कमांड लाइन" पर और WMI अपेक्षा के अनुरूप काम किया, लेकिन WPF में फिर से लिखने के बाद हम आप के रूप में एक ही समस्या का सामना करना पड़ा के बिना काम करना चाहिए । कुछ शोध के बाद मुझे पता चला है कि यदि आप एसटीए (सिंगल थ्रेडिंग अपार्टमेंट मोड) में काम कर रहे हैं लेकिन एसटीए मोड में डब्ल्यूपीएफ ऑपरेटिंग करते हैं, तो हम कार्य को करने के लिए थ्रेडपूल (आपके मामले में पुनः लिखना) का उपयोग कर रहे हैं:

 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) 
        { 
        } 
       } 
      }); 
संबंधित मुद्दे