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
生成一个字符串
数组