我需要使用Task.Factory.StartNew语法将参数传递给Task(DotNet 4.0+),但似乎无法弄清楚如何在VB.Net中创建匿名函数(C#语法是根本不同的和在线转换器不起作用。)
这里是代码(看起来它可以工作,但是大部分任务在全局变量可以在迭代中改变之前完成 - 所以我需要直接将该变量传递给Task)。
Public CurrentTradeDataURL As String = String.Empty
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim tskGet_BTCE As Task(Of Trades.TradeData)() = New Task(Of Trades.TradeData)(17) {}
For i As Integer = 0 To 17
CurrentTradeDataURL = My.Settings.All_BTCE_URIs(i)
tskGet_BTCE(i) = Task.Factory.StartNew(Of Trades.TradeData)(AddressOf GetTradeData)
Next
Task.WaitAll(tskGet_BTCE)
For x As Integer = 0 To 17
Dim li As New ListViewItem
li.Text = My.Settings.All_BTCE_Names(x)
li.SubItems.Add(ObjToStr(tskGet_BTCE(x).Result.high))
li.SubItems.Add(ObjToStr(tskGet_BTCE(x).Result.low))
li.SubItems.Add(ObjToStr(tskGet_BTCE(x).Result.avg))
li.SubItems.Add(ObjToStr(tskGet_BTCE(x).Result.vol))
li.SubItems.Add(ObjToStr(tskGet_BTCE(x).Result.vol_cur))
li.SubItems.Add(ObjToStr(tskGet_BTCE(x).Result.last))
li.SubItems.Add(ObjToStr(tskGet_BTCE(x).Result.buy))
li.SubItems.Add(ObjToStr(tskGet_BTCE(x).Result.sell))
li.SubItems.Add(ObjToDate(tskGet_BTCE(x).Result.updated).ToString)
li.SubItems.Add(ObjToDate(tskGet_BTCE(x).Result.server_time).ToString)
Me.ListView1.Items.Add(li)
Next
End Sub
Function GetTradeData() As Trades.TradeData
Dim retval As New Trades.TradeData
retval = CoreProcedures.GetHttpData(CurrentTradeDataURL, Nothing, CoreProcedures.MethodType.GET)
Return retval
End Function
我希望将功能更改为
GetTradeData(CurrentTradeDataURL As String)
并直接将字符串传递给它。 我知道没有Lambda表达式是不可能的,但是不知道如何在VB.Net中这样做。
答案 0 :(得分:0)
好的 - 弄清楚了(我找到了Sub()表达式的语法并将其更改为函数) - 我以“旧方式”离开以供参考:
'Public CurrentTradeDataURL As String = String.Empty
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim tskGet_BTCE As Task(Of Trades.TradeData)() = New Task(Of Trades.TradeData)(17) {}
For i As Integer = 0 To 17
' CurrentTradeDataURL = My.Settings.All_BTCE_URIs(i)
'tskGet_BTCE(i) = Task.Factory.StartNew(Of Trades.TradeData)(AddressOf GetTradeData)
Dim uri As String = My.Settings.All_BTCE_URIs(i)
tskGet_BTCE(i) = Task.Factory.StartNew(Function() As Trades.TradeData
Return GetTradeData(uri)
End Function)
Next
Task.WaitAll(tskGet_BTCE)
For x As Integer = 0 To 17
Dim li As New ListViewItem
li.Text = My.Settings.All_BTCE_Names(x)
li.SubItems.Add(ObjToStr(tskGet_BTCE(x).Result.high))
li.SubItems.Add(ObjToStr(tskGet_BTCE(x).Result.low))
li.SubItems.Add(ObjToStr(tskGet_BTCE(x).Result.avg))
li.SubItems.Add(ObjToStr(tskGet_BTCE(x).Result.vol))
li.SubItems.Add(ObjToStr(tskGet_BTCE(x).Result.vol_cur))
li.SubItems.Add(ObjToStr(tskGet_BTCE(x).Result.last))
li.SubItems.Add(ObjToStr(tskGet_BTCE(x).Result.buy))
li.SubItems.Add(ObjToStr(tskGet_BTCE(x).Result.sell))
li.SubItems.Add(ObjToDate(tskGet_BTCE(x).Result.updated).ToString)
li.SubItems.Add(ObjToDate(tskGet_BTCE(x).Result.server_time).ToString)
Me.ListView1.Items.Add(li)
Next
End Sub
Function GetTradeData(CurrentTradeDataURL As String) As Trades.TradeData
Dim retval As New Trades.TradeData
retval = CoreProcedures.GetHttpData(CurrentTradeDataURL, Nothing, CoreProcedures.MethodType.GET)
Return retval
End Function
在VB.Net中,语法不能通过工具转换为C#(反之亦然),所以我希望这会有所帮助。这比我想象的容易。