Как это сделать без лямбды?

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?

Как?


person user4951    schedule 28.04.2019    source источник
comment
Нет, если ваш метод требует более одного параметра (и создание другого метода невозможно). Но почему вы вообще хотите избавиться от лямбды?   -  person Visual Vincent    schedule 28.04.2019
comment
Возможный дубликат AddressOf с параметром   -  person 41686d6564    schedule 28.04.2019
comment
Вы можете определить действие в другом месте. Что обычно реализуется с помощью Lambda :)   -  person Jimi    schedule 28.04.2019
comment
Пожалуйста, постарайтесь выбрать лучшие/содержательные заголовки для ваших вопросов :)   -  person 41686d6564    schedule 28.04.2019
comment
Я думаю, что это решит мою проблему. Однако этот вопрос должен остаться. Это более ясно. Другой для обработчика.   -  person user4951    schedule 29.04.2019


Ответы (1)


Вам нужно создать метод, который удовлетворяет любой из существующих перегрузок 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 — сэкономит время разработчика, отображая возможные ошибки во время компиляции, а не во время выполнения.

person Fabio    schedule 28.04.2019
comment
Я хочу передать больше параметров, чем просто задачу. На самом деле задача вообще не нужна. - person user4951; 29.04.2019
comment
@user4951 user4951, это была моя точка зрения, если вы хотите использовать метод с другой сигнатурой, чем лямбда-выражения, принятые ContinueWith, вы должны обернуть свой метод другим, который будет иметь принятую сигнатуру. - person Fabio; 29.04.2019
comment
Option Strict On значительно облегчит вам жизнь, потому что укажет на возможные проблемы с типом/подписью гораздо раньше и сэкономит ваше время. Например, с Option String On ваш код не скомпилируется, потому что нет перегрузки ContinueWith, которая принимает Action в качестве аргумента. - person Fabio; 29.04.2019