我坚持将这个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
根据Brian的建议,这仍然不起作用。
如何将参数传递给WriteStuff?
最后,我还将委托函数DlgR()作为对象获得签名兼容性错误。
答案 0 :(得分:1)
VB.Net在支持lambda表达式方面做得不是很好(参见Use Lambda Expression within ASP.NET MVC View using 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文章Towards Cleaner Code, A C# Asynchronous Helper,因此我在示例中使用了委托的名称和签名。如果您使用的是其他库,则代理的名称和签名可能会有所不同。
更新:VB.Net does not support closures(查看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
答案 1 :(得分:0)
最后解决了这个问题,在'多行'中它是在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)
我想我应该在没有使用MSMQ的情况下使用MS Enterprise Library调用此异步日志记录,但是你得到了漂移。
希望这有助于其他人。