2012-07-08 100 views
0

使用lambda表达式导致内存泄漏吗?声明委托使用lambda表达式抛出异常

我想声明一个委托内一个子,并将其用作“一次只”的事件处理程序,然后将其设置为没有它一旦被解雇。这样的事情:

Private Sub MySub() 
    Dim o As SomeObject 
    Dim d as System.Delegate = Sub() 
        'Do some stuff 
        d = Nothing 
       End Sub 
    AddHandler o.SomeEvent, d 
End Sub 

但我在addhandler上得到了无效的转换异常。但是可能/需要这样的东西?

sry for no code hilite我在堆栈移动

回答

1

以下示例是一个Windows窗体;该窗体包含一个按钮,其Click事件连接到该子例程:Button1_Click。

单击按钮会导致创建SomeClass(o),添加事件处理程序并开始工作。 StartWork将调用创建线程的Anonymous方法,使用另一个Anonymous方法来模拟工作,然后释放(o)引用。

Public Class Form1 
    Private Class SomeClass 
     Public Event DoWork() 

     Sub StartWork() 
      RaiseEvent DoWork() 
     End Sub 
    End Class 

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click 
     Debug.WriteLine("Button1_Click Started.") 
     ' create class 
     Dim o As New SomeClass() 
     ' add handlers 
     AddHandler o.DoWork, Sub() 
           Debug.WriteLine("o.DoWork Event Handler Started.") 
           ' threading 
           Dim t As New Threading.Thread(Sub() 
                    Debug.WriteLine("Worker Thread Started.") 
                    ' simulate work (5 seconds) 
                    Threading.Thread.Sleep(5000) 
                    ' release reference 
                    o = Nothing 
                    Debug.WriteLine("Worker Thread Stopped.") 
                   End Sub) 
           t.Start() 
           Debug.WriteLine("o.DoWork Event Handler Stopped.") 
          End Sub 
     ' start the work 
     o.StartWork() 
     Debug.WriteLine("Button1_Click Stopped.") 
    End Sub 
End Class 
+0

嗯......在我等待某人回答的时候,我有一样的想法。但后来想到只是使用内置的EventHandler/RoutedEventHandler类会做同样的事情。有点像o = New EventHandler(SomeLambdaFunction),然后从SomeLambdaFunction函数内部设置o = Nothing。这是否也会释放GC的对象和lambda? – 2012-07-09 18:04:54