Vb.net 声明要用作lambdas强制转换异常的委托

Vb.net 声明要用作lambdas强制转换异常的委托,vb.net,delegates,Vb.net,Delegates,使用lambda表达式是否会导致内存泄漏 我试图在子对象中声明一个委托,并将其用作“仅一次”事件处理程序,然后在触发后将其设置为nothing。像这样的事情: Private Sub MySub() Dim o As SomeObject Dim d as System.Delegate = Sub() 'Do some stuff d = Nothing End Sub

使用lambda表达式是否会导致内存泄漏

我试图在子对象中声明一个委托,并将其用作“仅一次”事件处理程序,然后在触发后将其设置为nothing。像这样的事情:

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 i on stack mobile

以下示例是一个windows窗体;表单包含一个按钮,其单击事件连接到子例程:Button1\u Click

单击该按钮将创建SomeClass(o),添加事件处理程序并开始工作。StartWork将调用创建线程的匿名方法,使用另一个匿名方法模拟工作,然后释放(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

六羟甲基三聚氰胺六甲醚。。。在我等待别人回答的时候,我也有同样的想法。但是接下来考虑是否只使用内置的EventHandler/RoutedEventHandler类就可以做同样的事情。有点像o=neweventhandler(SomeLambdaFunction),然后在SomeLambdaFunction函数中设置o=Nothing。这是否也会释放GC的对象和lambda?