Я встречал что-то похожее, когда пытался использовать лямбда-выражения в VBNET2008.
Поскольку ключевое слово Function используется для указания компилятору, что используется лямбда-выражение, выражение должно возвращать значение. В этом сценарии использование ключевого слова Sub было бы более уместным, но это пока невозможно в VBNET2008.
VBNET2010 должен решить эту проблему, разрешив Subs в лямбда-выражениях.
Вот пример обходного пути, который отлично сработал для меня в этом вопросе о SO:
Каким будет эквивалентный код VB.NET для этого C # ...
Короче говоря, вместо того, чтобы записывать свое лямбда-выражение в ядро вашего метода, вам нужно указать Sub, с которым вы хотите выполнить работу, используя AddressOf Sub.
Дэвид Парвин также написал обходной путь именно так, как вам нужно.
EDIT:
Вы всегда можете выбрать решение для делегата.
Частный делегат Sub MyMethodAsync ()
Public Sub Button1_Click(...) Handles Button1.Click
Dim myMethodAsync As MyMethodAsync = AddressOf MyDoWorkAsync
_myBackgroundWorker.RunWorkerAsync(myMethodAsync)
Dim loadingForm = New LoadingForm()
loadingForm.ShowDialog()
End Sub
Private Sub _myBackgroundWorker_DoWork([parameters here...]) Handles _myBackgroundWorker.DoWork
' Do some stuff...
End Sub
Я знаю, что это не анонимный метод, поэтому вам, возможно, будет очень трудно пытаться работать таким образом в VBNET, даже в 2008 году. Предполагается, что такие функции являются частью VBNET2010, но я думаю, что они его исключают, но Я действительно не достаточно уверен, чтобы подтвердить это твердо.
Надеюсь, это поможет!