2010-12-03 5 views
0

私は解決しようとしている問題をテストするために、次のコードを使用しています。Vb.net WPFディスパッチャーデリゲートメモリリークのヘルプ

Class MainWindow 
    Dim bw As BackgroundWorker = New BackgroundWorker() 

    Private Sub Window_Loaded(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) 
     AddHandler bw.DoWork, AddressOf bw_DoWork 
     AddHandler bw.RunWorkerCompleted, AddressOf bw_RunWorkerCompleted 

     bw.RunWorkerAsync() 
    End Sub 

    Private Sub bw_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs) 
     For i As Integer = 0 To 250000 
      Dim d As New test_delegate(AddressOf test) 
      Dispatcher.Invoke(d, " SUPER SUPER SUPERSPERSUPERSUPERvSUPERSUPERSUPERSUPERv LONG Test") 
     Next 
    End Sub 

    Private Delegate Sub test_delegate(ByVal txt As String) 
    Private Sub test(ByVal txt As String) 
     txtTest.Text = txt 
    End Sub 
End Class 

アプリケーションのメモリがゆっくりではあるが顕著にリークします。

作成している各代理人をどのようにクリーンアップ(または処分)しますか? d.disposeが存在しないため?

ありがとうございました!

+1

私はこの例を実行しましたが、私は任意のメモリリークが表示されません。私は時間の経過と共にメモリがわずかに増加していますが、250kのデリゲートを作成するオーバーヘッド以上のものはないことを示しているものはありません。 – rossisdead

+0

それは本当ですが、メモリ内の250kのデリゲートは決して去らない...私は彼らと一緒にやった後、どうやって離れさせるの? – tcables

答えて

0

私はあなたがグローバルスコープで新しいデリゲートを宣言し、必要に応じて起動した場合、それは、この問題を修正することを考え出し:

Class MainWindow 
    Dim bw As BackgroundWorker = New BackgroundWorker() 

    Private Sub Window_Loaded(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) 
     AddHandler bw.DoWork, AddressOf bw_DoWork 
     AddHandler bw.RunWorkerCompleted, AddressOf bw_RunWorkerCompleted 

     bw.RunWorkerAsync() 
    End Sub 

    Private Sub bw_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs) 
     For i As Integer = 0 To 250000 
      Dispatcher.Invoke(d, " SUPER SUPER SUPERSPERSUPERSUPERvSUPERSUPERSUPERSUPERv LONG Test") 
     Next 
    End Sub 

    Dim d As New test_delegate(AddressOf test) 
    Private Delegate Sub test_delegate(ByVal txt As String) 
    Private Sub test(ByVal txt As String) 
     txtTest.Text = txt 
    End Sub 
End Class 
関連する問題