0

ラムダ式を使用すると、メモリリークが発生しますか?

サブ内でデリゲートを宣言し、それを「1回限り」のイベントハンドラーとして使用し、起動されたら何も設定しないようにしています。このような何か:

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で無効なキャスト例外が発生します。しかし、このようなものは可能/必要ですか?

コードハイライトがないことを確認してください私はスタックモバイルにいます

4

1 に答える 1

1

次の例はWindowsフォームです。フォームには、Clickイベントがサブルーチンに関連付けられた単一のボタンButton1_Clickが含まれています。

ボタンをクリックすると、SomeClassが作成され(o)、イベントハンドラーが追加され、作業が開始されます。StartWorkは、スレッドを作成するAnonymousメソッドを呼び出し、作業をシミュレートしてから(o)参照を解放する別のAnonymousメソッドを使用します。

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
于 2012-07-09T14:23:14.247 に答える