2010-12-03 50 views
0

J'utilise le code suivant pour tester un problème que j'essaie de résoudre.Vb.net WPF répartiteur délégué fuite de la mémoire aide

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 

L'application laisse fuir la mémoire lentement mais sensiblement. Comment puis-je nettoyer (ou éliminer) chaque délégué que je suis en train de créer? puisqu'il n'y a pas de but?

merci!

+1

J'ai couru cet exemple, mais je ne vois aucune fuite de mémoire. Je vois une légère augmentation de la mémoire au fil du temps, mais rien qui indique qu'il y a quelque chose de plus que la surcharge de 250k délégués. – rossisdead

+0

c'est vrai, mais les 250k délégués en mémoire ne disparaissent jamais ... comment puis-je les faire partir après que j'en ai fini avec eux? – tcables

Répondre

0

Je compris que si vous déclarez le nouveau délégué dans la portée globale et invoquez au besoin, il résout ce problème:

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