Вы не правильно различаете WaitAll
и WhenAll
.WhenAll
само по себе ожидаемо, а WaitAll
- нет.Вы либо хотите это:
If Task.WaitAll(taskList) Then
'All tasks completed.
или это:
Await Task.WhenAll(taskList)
'All tasks completed.
Вы должны прочитать документацию для этих методов.Вы должны ВСЕГДА читать соответствующую документацию, когда что-то не работает, как вы ожидаете.Сайты, подобные этому, являются последним средством, а не первым вариантом.
РЕДАКТИРОВАТЬ:
Я только что понял, что вы ожидаете Task.WhenAll
, но затем вы игнорируете этот результат и снова вызываете Task.WhenAll
безв ожидании этогоСначала я увидел второй звонок и больше не смотрел, чтобы заметить первый звонок.Я приведу пример, который, надеюсь, прояснит ситуацию.
РЕДАКТИРОВАТЬ:
Вот пример того, как позвонить WhenAll
.Для этого кода требуется форма Windows с Button
и TextBox
с Multiline
, установленным на True
.Код запускает 10 задач, которые возвращают String
, и ожидает их завершения, вызывая WhenAll
и ожидая его.Когда все задачи завершены, WhenAll
возвращает массив, содержащий результат каждой отдельной задачи.
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)
, то тип возвращаемого значения WhenAll
равен Task(Of T())
.В вашем и моем случае это означает, что ожидание WhenAll
приводит к массиву String
.