2011-09-22 39 views
0

我的問題與Periodical WMI Query Causes Memory Leak?類似,但帶有線程。WMI導致內存泄漏(在多線程中運行時)

我在寫一個簡單的應用程序來監視來自多個服務器的進程和內存信息。但是有內存泄漏。我已經減少了以下簡單的控制檯應用程序的問題。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Management; 
using System.Threading; 


namespace ConsoleApplication1 
{ 
    class Program 
    { 
     public static void dummyQuery(string ip, string query) 
     { 
      ConnectionOptions connOptions = new ConnectionOptions(); 
      ManagementScope mgtScope = new ManagementScope(@"\\" + ip + @"\ROOT\CIMV2", connOptions); 


      mgtScope.Connect(); 

      ObjectQuery queryo = new ObjectQuery(query); 

      using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(mgtScope, queryo)) 
      { 

       using (ManagementObjectCollection moc = searcher.Get()) 
       { 

       } 
      } 
     } 

     static void Main(string[] args) 
     { 
      Console.ReadKey(); 
      int times = 10000; 
      for (int i = 0; i < times; i++) 
      { 

       Thread t = new Thread(o => dummyQuery("xxxxxxxxx", @"SELECT WorkingSetSize FROM Win32_Process WHERE name='W3WP.exe'")); 
       //t.IsBackground = true; 

       t.Start(); 

       System.Threading.Thread.Sleep(50); 
      } 
      Console.ReadKey(); 
      //GC.Collect(); 
      Console.ReadKey(); 
     } 
    } 
} 

有沒有一種方法可以安全地從線程運行WMI查詢?

這是從一個非常複雜的wpf應用程序中提取的,該應用程序很像dummyQuery方法來檢查許多服務器的狀態。該應用程序以與WMI調用相關的令人不安的快速速率泄漏內存。這個例子看起來好像不是內存泄漏(Jim Mischel有更好的方法來檢查這個)。我將安裝一個探查器並再次查看原始應用程序。

+3

你爲什麼要調用GC.Collect();手動? – Terrance

+1

您是否確認內存分析器存在內存泄漏? – Yahia

+0

也有你嘗試使用http://msdn.microsoft.com/en-us/library/system.management.wqlobjectquery.aspx – Terrance

回答

3

我知道這可能被認爲是一個死的線程,但它是搜索列表的頂部時,我正在尋找解決方案,我遇到ManagementObjectSearcher內存泄漏問題。

我的應用程序是一個多線程應用程序,在主線程上調用WMI作爲初始化過程的一部分。然後,應用程序產生了多個線程,其中使用了WMI。但是,當作爲Windows服務運行時,應用程序一直在泄漏內存(如果它作爲標準可執行文件運行,那麼該應用程序可以正常運行)。

在Main入口點放置[MTAThread]屬性可解決問題。

+0

我實際上不能確認這是正確的。但我認爲它是。 – user833970