Vb.net Task.whalll没有';不能完成所有任务;它在完成第一个任务时返回

Vb.net Task.whalll没有';不能完成所有任务;它在完成第一个任务时返回,vb.net,async-await,task-parallel-library,Vb.net,Async Await,Task Parallel Library,Task.whalll在完成第一个任务时返回。我只是循环记录并将其添加到taskList中,然后等待Task。当所有的时,但在调试时,我发现它在完成第一个任务后返回到主功能。请检查我的TrackPackages功能: Public Async Function TrackPackages(ByVal trackingNos As String) As Task(Of String) Dim trackResponseXml As String = String.Empty Di

Task.whalll
在完成第一个任务时返回。我只是循环记录并将其添加到
taskList
中,然后等待
Task。当所有的
时,但在调试时,我发现它在完成第一个任务后返回到主功能。请检查我的
TrackPackages
功能:

Public Async Function TrackPackages(ByVal trackingNos As String) As Task(Of String)

    Dim trackResponseXml As String = String.Empty
    Dim skipNos As Integer = 0
    Dim takeNos As Integer = 10
    Dim strResponses As String = String.Empty
    Dim taskList As List(Of Task(Of String)) = New List(Of Task(Of String))()

    If Not String.IsNullOrEmpty(trackingNos) Then
        Dim totalTrackingNos As List(Of String) = trackingNos.Split(","c).ToList()
        skipNos = 0
        'Dim totallparalleltask = (totalTrackingNos.Count / 35)
        'For var = 0 To totallparalleltask
        While skipNos < totalTrackingNos.Count
            Dim trackingNoArray = totalTrackingNos.Skip(skipNos).Take(takeNos).ToList()
            taskList.Add(Task.Run(Function() GetTrackResponseXML(trackingNoArray)))

            skipNos = skipNos + 10
        End While
        'Next var
        Dim lastindex As Integer = 0

        'Here is issue with task.whenall it returns on completion of first task
        Dim alltaskstring = Await Task.WhenAll(taskList.ToArray)

        If (Task.WhenAll(taskList).IsCompleted) Then
            'Dim abcsdsd As String = Await GetTrackResponseString(item, trackResponseXml)
            Return trackResponseXml
        End If
    End If

End Function
公共异步函数TrackPackages(ByVal trackingNos作为字符串)作为任务(字符串的)
Dim trackResponseXml As String=String.Empty
Dim skipNos作为整数=0
作为整数的Dim takeNos=10
Dim strResponses As String=String.Empty
将任务列表作为列表(任务的列表(字符串的列表))=新列表(任务的列表(字符串的列表))()
如果不是String.IsNullOrEmpty(trackingNos),则
Dim totalTrackingNos作为列表(字符串)=trackingNos.Split(“,”c).ToList()
skipNos=0
“Dim TotalTrackingNo.Count=(总计跟踪编号/35)
'对于var=0的任务
而skipNos

它应该完成
任务中的所有任务。WhenAll(任务列表)
您没有正确区分
WaitAll
WhenAll
WhenAll
本身是可等待的,而
WaitAll
不是。你要么想要这个:

If Task.WaitAll(taskList) Then
    'All tasks completed.
或者这个:

Await Task.WhenAll(taskList)

'All tasks completed.
您应该阅读这些方法的文档。当某些东西不能按预期工作时,您应该始终阅读相关文档。像这样的网站是最后的选择,而不是第一选择

编辑:

我刚刚意识到您正在等待
Task.whalll
,但随后您忽略该结果并再次调用
Task.whalll
而不等待它。我先看到了第二个电话,没有再去注意第一个电话。我将提供一个例子,希望能澄清问题

编辑:

下面是一个如何调用
whalll
的示例。此代码要求Windows窗体具有
按钮
文本框
,且
多行
设置为
。代码启动10个返回
字符串的任务,并通过调用
whalll
并等待它来等待它们完成。所有任务完成后,
whalll
返回一个数组,其中包含每个任务的结果

Private rng As New Random

Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim tasks As New List(Of Task(Of String))

    For i = 1 To 10
        tasks.Add(GetTimeStringAsync(i))
    Next

    'Wait for all tasks to complete and aggregate the results.
    Dim results = Await Task.WhenAll(tasks)

    'Use the aggregated results.
    TextBox1.Lines = results
End Sub

Private Async Function GetTimeStringAsync(number As Integer) As Task(Of String)
    'Get the current time as text after a random delay of between 2 and 10 seconds.
    Return Await Task.Run(Async Function()
                              Await Task.Delay(rng.Next(2000, 10000))

                              Return $"{number}: {Date.Now:HH:mm:ss.fffff}"
                          End Function)
End Function
请注意,如果任务方法的类型为
task(Of T)
,那么
的返回类型为
task(Of T())
。在您和我的情况下,这意味着等待
whalll
生成一个
字符串
数组