2011-12-12 45 views
1

每次計時器滴答時,應用程序都會繼續使用額外的內存。
如何處理GetActeWindowTitle()和window2中的句柄?
我該如何管理內存使用情況?管理CPU使用

我的代碼:

public partial class Window1 : Window 
{ 
    Window2 window2 ; 

    System.Windows.Forms.Timer timer1; 
    public Window1() 
    { 
     InitializeComponent(); 

     timer1 = new Timer(); 
     timer1.Interval = 900000; 
     timer1.Tick += new EventHandler(timer1Tick); 
     timer1.Start();    
    } 

    private void timer1Tick(object Sender, EventArgs e) 
    {        
     window2 = new window2Window(); 

     if (((GetActeWindowTitle().IndexOf("Outlook") != -1) || 
     (GetActeWindowTitle().IndexOf("Word") != -1))) 
     { 
      window2.Close(); 
     } 
     else 
     { 
      window2.Show(); 
      window2.Topmost = true; 
     } 
    } 

    private string GetActeWindowTitle() 
    { 
     const int nChars = 256; 
     IntPtr handle = IntPtr.Zero; 
     StringBuilder Buff = new StringBuilder(nChars); 
     handle = GetForegroundWindow(); 
     if (GetWindowText(handle, Buff, nChars) > 0) 
     { 
      return Buff.ToString();    
     } 
     return null; 
    }  
} 
+0

是關於CPU使用率或內存的問題?什麼是'window2Window'並且它實現了IDisposable?如何衡量內存使用情況,並在垃圾回收後停止使用? –

+0

你爲什麼要創建windows2然後關閉?爲什麼不只是新的window2Window在else? – Paparazzi

+0

當我看着taskmanager時,內存正在爲每個計時器滴答滴答。 –

回答

1

也許通過釋放被從IntPtr的引用了互操作調用分配的內存。

試試這個使用後,你GetActeWindowTitle()處理:

Marshal.FreeCoTaskMem(handle); 
+0

非常感謝您的回覆。我用Marshal.FreeCoTaskMem(句柄).still內存泄漏。我的意思是每15分鐘10萬。 –

0

爲什麼要創建新window2Window只能關門了嗎?

// window2 = new window2Window(); 

if (((GetActeWindowTitle().IndexOf("Outlook") != -1) || 
(GetActeWindowTitle().IndexOf("Word") != -1))) 
{ 
    // window2.Close(); 
} 
else 
{ 
    window2 = new window2Window(); 
    window2.Show(); 
    window2.Topmost = true; 
}