Как это сделать без лямбды? - PullRequest
0 голосов
/ 28 апреля 2019
Public Shared Async Function getMarketDetailFromAllExchangesAsync() As Task
    Dim taskList = New List(Of Task)
    Dim starttime = jsonHelper.currentTimeStamp
    LogEvents("Start Getting Market Detail of All")
    For Each account In uniqueAccounts().Values
        Dim newtask = account.getMarketInfoAsync().ContinueWith(Sub() account.LogFinishTask("GetMarketDetail", starttime))
        taskList.Add(newtask)
        'newtask.ContinueWith(Sub() LogEvents(account.ToString))
    Next
    Await Task.WhenAll(taskList.ToArray)
    Dim b = 1
End Function

Есть ли способ сделать .ContinueWith (Sub () account.LogFinishTask ("GetMarketDetail", starttime)) вместо addressOf?

Как?

1 Ответ

1 голос
/ 28 апреля 2019

Вам необходимо создать метод, который удовлетворяет любой из существующих ContinueWith перегрузок.
В вашем конкретном случае он должен удовлетворять сигнатуре Action(Of Task).

Но поскольку в ConitnuesWith вы используете account экземпляр, вы не сможете использовать AddressOf с методом класса, в котором выполняется цикл.

В качестве обходного пути вы можетесоздать требуемый метод в классе account

Public Class Account
    Public Sub LogFinishedMarketDetail(task As Task)
        Dim starttime = jsonHelper.currentTimeStamp
        Me.LogFinishTask("GetMarketDetail, starttime")
    End Sub
End Class

Использование

For Each account In uniqueAccounts().Values
    Dim newtask = 
        account.getMarketInfoAsync().ContinueWith(AddressOf account.LogFinishedMarketDetail)
    taskList.Add(newtask)
Next

Предложение - установите Option Strict в On - сэкономит время разработчика, отображая возможные ошибки во время компиляциивместо времени выполнения.

...