将参数传递给vb.net 4.5中的异步任务(使用Task.Factory.StartNew)

时间:2014-01-29 06:50:18

标签: .net vb.net asynchronous task-parallel-library

我需要使用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中这样做。

1 个答案:

答案 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#(反之亦然),所以我希望这会有所帮助。这比我想象的容易。