2010-06-29 51 views
2

我有一個應用程序使用.net UIAutomation,它最終耗盡內存和崩潰只是監視窗口正在顯示和關閉。似乎比C#更容易在VB中顯示此內容,但發生的方式都是相同的。它似乎是底層代理對象中的泄漏/池。大多數內存不會被用作.net內存。這是爲什麼.net UIAutomation應用程序泄漏/共享?

任何想法如何讓這個停止泄漏,並仍然監視StructureChangedEvents?

Imports System.Windows.Automation 
Public Class Form1 

Delegate Sub AddListCallback(ByVal Text As String) 
Dim UIAeventHandler As StructureChangedEventHandler 

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
    BtnStartStop.Text = "Stop" 
    Subscribe() 
End Sub 

Private Sub BtnStartStop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnStartStop.Click 
    If "Start" = BtnStartStop.Text Then 
     BtnStartStop.Text = "Stop" 
     Subscribe() 
    Else 
     BtnStartStop.Text = "Start" 
     Unsubscribe() 
     lbEvents.Items.Clear() 
     GC.GetTotalMemory(True) 
    End If 
End Sub 

Public Sub Subscribe() 
    UIAeventHandler = New StructureChangedEventHandler(AddressOf OnUIAutomationEvent) 
    Automation.AddStructureChangedEventHandler(AutomationElement.RootElement, TreeScope.Descendants, UIAeventHandler) 
End Sub 

Public Sub Unsubscribe() 
    Automation.RemoveStructureChangedEventHandler(AutomationElement.RootElement, UIAeventHandler) 
End Sub 

''' <summary> 
''' AutomationEventHandler delegate. 
''' </summary> 
''' <param name="src">Object that raised the event.</param> 
''' <param name="e">Event arguments.</param> 
Private Sub OnUIAutomationEvent(ByVal src As Object, ByVal e As StructureChangedEventArgs) 
    ' Make sure the element still exists. Elements such as tooltips can disappear 
    ' before the event is processed. 
    If e.StructureChangeType = StructureChangeType.ChildrenInvalidated Then 
     Exit Sub 
    End If 
    Dim sourceElement As AutomationElement 
    Try 
     sourceElement = DirectCast(src, AutomationElement) 
    Catch ex As ElementNotAvailableException 
     Exit Sub 
    End Try 
    ' TODO Handle any other events that have been subscribed to. 
    Console.WriteLine("Element : """ & sourceElement.Current.LocalizedControlType & """ """ & sourceElement.Current.Name _ 
     & """ Struct Change Type : " & [Enum].GetName(GetType(StructureChangeType), e.StructureChangeType) _ 
     & " Runtime ID : " & getString(e.GetRuntimeId())) 
End Sub 

Private Function getString(ByVal ints As Integer()) As String 
    getString = "" 
    For Each i As Integer In ints 
     getString = getString & " " & i.ToString 
    Next 
End Function 
End Class 

回答

0

當你取消我會做這樣的事情:

Automation.RemoveAllEventHandlers(); 
UIAeventHandler = null; 

UIAutomation會保留一些線程活着,只要你有圍繞AutomationEventHandler對象。對我來說,它幾乎是一個黑盒子,但上面已經解決了我所有的問題。

+0

嗯,我希望監聽器在應用程序運行期間運行。我嘗試了停止並開始多次,以查看它是否釋放內存,包括清理處理程序的建議,以便可以通過GC進行清理。儘管不幸的是有些內存被釋放,但每次添加事件處理程序後似乎仍會增加1000-2000k。 – 2010-06-30 16:22:26