Делегаты в VB - как из C#?
Я застрял на преобразовании этого кода C# в VB:
AsyncHelpers.Async.Do(delegate { WriteStuff("additional stuff..."); });
Я думал, что это будет что-то вроде
AsyncHelpers.Async.Do(Function() WriteStuff("additional stuff...")
но я получаю ошибку "Выражение не дает значения".
Может кто-нибудь дать мне соответствующий перевод VB.Net?
Благодарю.
========== ОБНОВЛЕНИЕ
.
.
.
Async.Do(New DlgR(AddressOf WriteStuff))
End Sub
Friend Shared Sub WriteStuff(ByVal thisStr As String)
'do stuff with thisStr
End Sub
Основываясь на предложении Брайана ниже, это все еще не работает.
Как получить параметр, переданный в WriteStuff?
Наконец, я также получаю ошибку совместимости подписи с делегированной функцией DlgR() в качестве объекта.
2 ответа
Наконец-то дошло до решения этой проблемы, в "более чем одной строке" именно в C#...
Я объявил своего делегата на уровне класса:
Public Delegate Sub loggerDelegate(ByVal a As LogEntry)
Затем внутри моего метода я делаю асинхронный вызов
' make the async logging call
Dim myDel As loggerDelegate = New loggerDelegate(AddressOf Logger.Write)
myDel(logEntry)
Полагаю, мне следовало бы назвать это "Асинхронное ведение журнала с MS Enterprise Library без использования MSMQ", но вы получаете дрейф.
Надеюсь, это поможет кому-то еще.
VB.Net не очень хорошо справляется с поддержкой лямбда-выражений (см. Использование лямбда-выражений в ASP.NET MVC View с использованием VB.NET).
Вы можете попробовать что-то вроде этого...
Sub Main()
Async.Do(New DlgR(AddressOf WriteStuff))
End Sub
Public Function WriteStuff(ByVal msg As String) As Object
Console.WriteLine(msg)
Return Nothing
End Function
Исходя из вашего кода, я предполагаю, что вы следовали статье CodeProject, " К чистому коду", A C# Asynchronous Helper, поэтому я использовал имя и подпись делегата из этого примера. Если вы используете другую библиотеку, имя и подпись делегата могут отличаться.
ОБНОВЛЕНИЕ: VB.Net не поддерживает замыкания (см. http://msmvps.com/blogs/bill/archive/2006/04/05/89370.aspx для получения дополнительной информации), поэтому вы не можете, насколько я могу сказать, передать параметры в метод. Самый простой способ сделать это - создать собственный класс замыкания и назвать его следующим образом...
Module Module1
Sub Main()
Dim c1 = New MyClosure("Hello World")
Dim c2 = New MyClosure("Test 123")
CodeToast.Async.Do(New Dlg(AddressOf c1.WriteStuff))
CodeToast.Async.Do(New Dlg(AddressOf c2.WriteStuff))
Console.ReadKey()
End Sub
End Module
Public Class MyClosure
Public Sub New(ByVal msg As String)
Message = msg
End Sub
Public Message As String
Public Sub WriteStuff()
Console.WriteLine(Message)
End Sub
End Class