VB2008でデリゲートの代わりにラムダ式が使えるというので、試してみたのですが、うまくいきません。
試したコードは下記です。WindowsFormアプリで、Form1にButton1とLabel1を貼りつけております。
Button1を押すとLabel1に"はじめました"と表示し、2秒待ってから"おわりました"と表示するつもりです。
デリゲートを使った(2)は意図した動作をしますが、ラムダ式を使った(1)はLabel1に何も表示しません。
このようなことはできないのでしょうか?
Public Class Form1
Private Delegate Sub longTaskDelegate()
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Label1.Text = ""
Dim dlg As New longTaskDelegate(AddressOf LongTask)
dlg.BeginInvoke(AddressOf longTaskCallback, dlg)
End Sub
Private Sub longTaskCallback(ByVal ar As IAsyncResult)
Dim dlg As longTaskDelegate = DirectCast(ar.AsyncState, longTaskDelegate)
dlg.EndInvoke(ar)
End Sub
Private Delegate Sub displayMessageDelegate(ByVal msg As String)
Private Sub DisplayMessage(ByVal msg As String)
If Label1.InvokeRequired Then
Label1.Invoke(Function() Label1.Text = msg) ' --- (1)
'Label1.Invoke(New displayMessageDelegate(AddressOf Me.DisplayMessage), msg) ' --- (2)
Else
Label1.Text = msg
End If
End Sub
Private Sub LongTask()
DisplayMessage("はじめました")
System.Threading.Thread.Sleep(2000)
DisplayMessage("おわりました")
End Sub
End Class
お礼
さっそくVB2010 Expressを入手して試しましたところ、 教えていただいた記述でうまくいきました! あと追加で教えていただいたActionは調べてみたところ、 Label1.Invoke(New Action(Of String)(AddressOf Me.DisplayMessage), msg) てなかんじで書けるわけですね。もういちいちデリゲートを宣言する必要が ないですね! ありがとうございました。