Как выполнить задачу после другой задачи в vb.net? - PullRequest
0 голосов
/ 29 апреля 2019
    For Each account In _accounts11
        Dim newtask = account.readbalancesAsync()
        newtask = newtask.ContinueWith(Sub() account.LogFinishTask("Getting Balances", starttime))
        newtask = newtask.ContinueWith(Async Function() account.getOrdersAsync())
        newtask = newtask.ContinueWith(Sub() account.LogFinishTask("Getting Orders", starttime))

        tasklist.Add(newtask)
    Next


    Await Task.WhenAll(tasklist.ToArray)
    Dim b = 1

По сути, для каждой учетной записи я хочу сделать account.readbalancesAsync и после этого хочу сделать account.getOrdersAsync ()

Я оставил код newtask.ContinueWith(Sub() account.LogFinishTask("Getting Balances", starttime)), чтобы показать, что я знаю, как ContinueWithработает.Однако после этого мне нужно продолжить выполнение другой задачи.

Как мне это сделать?

Я пытаюсь сделать что-то вроде этого

    For Each account In _accounts11
        await account.readbalancesAsync()
        account.LogFinishTask("Getting Balances", starttime)
        await account.getOrdersAsync())
        account.LogFinishTask("Getting Orders", starttime)

        tasklist.Add(newtask)
    Next

Очевидно, что если я сделаю это так, то одна учетная запись должна дождаться завершения другой учетной записи.Я хочу, чтобы все учетные записи работали параллельно.

Или давайте посмотрим на этот код

dim response1 = await client.GetAsync("http://example.com/");
dim response2 = await client.GetAsync("http://stackoverflow.com/");

Скажем, я делаю это так

dim newtask = client.GetAsync("http://example.com/").continueWith(....)
await newtask

Что мне поставитьв ....

Ответы [ 2 ]

3 голосов
/ 29 апреля 2019

Я думаю, что вы ошиблись в каком-то повороте. Если вам нужно запускать эти четыре оператора друг за другом, но без вмешательства в цикл, все, что вам нужно сделать, - это создать одну задачу, выполняющую многострочное / блочное лямбда-выражение.

Например:

For Each account In _accounts11
    Dim newtask = Task.Run( 'Start a new task.
        Async Function() 'Multiline lambda expression.
            Await account.readbalancesAsync()
            account.LogFinishTask("Getting Balances", starttime)
            Await account.getOrdersAsync()
            account.LogFinishTask("Getting Orders", starttime)
        End Function
    ) 'End of Task.Run()

    tasklist.Add(newtask)
Next
0 голосов
/ 29 апреля 2019

Я просто хочу добавить что-то к ответу VisualVincent. Я все еще предпочитаю делать это с continueWith

Private Async Function readBalancesAndOrderForEachAccount(starttime As Long) As Task
    Await readbalancesAsync()
    LogFinishTask("Getting Balances", starttime)
    Await getOrdersAsync()
    LogFinishTask("Getting Orders", starttime)
End Function

Public Shared Async Function getMarketDetailFromAllExchangesAsync2() As Task
    Dim CurrentMethod = MethodBase.GetCurrentMethod().Name
    Dim tasklist = New List(Of Task)
    Dim starttime = jsonHelper.currentTimeStamp

...

        For Each account In _accounts11
            Dim newtask = account.readBalancesAndOrderForEachAccount(starttime)
            tasklist.Add(newtask)
        Next
        Await Task.WhenAll(tasklist.ToArray)
        Dim b = 1
   ...
    End Function

Это похоже на работу. Однако я хочу понять, как это сделать, используя continueWith, потому что мне очень любопытно.

...