如何在vb.net中执行另一项任务后的任务?

问题描述 投票:0回答:2
    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

我该怎么办......

vb.net task continuewith
2个回答
3
投票

我认为你错误地在某处错了。如果你需要在彼此之后运行这四个语句,但不干扰循环,那么你需要做的就是创建一个执行多行/块lambda表达式的任务。

例如:

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
投票

我只想在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这样做,因为我很好奇。

© www.soinside.com 2019 - 2024. All rights reserved.