我有一些.net代码使用Async和Task.Run()进行并行处理。
我遇到的这个问题是理解为什么它不会从Await Task.WhenAll(task)方法返回。
这是我设置任务的代码:
Dim tasks As New List(Of Task(Of String))
For Each child As TreeViewNodeData In tv_node_data.Children
'*Find Tooltip (This will run the validation for the child)*
tasks.Add(Task.Run(Function() FindTooltip(child)))
Next
Dim results As String() = Await Task.WhenAll(tasks)
这是任务调用的方法。
Private Function FindTooltip(child As TreeViewNodeData) As String
Try
Dim tip As String = child.Feature?.Tooltip
Return tip ' <== when stepping through, I can see that the tooltip is outputted as expected
Catch ex As Exception
Throw
Return String.Empty
End Try
End Function
该问题可能与工具提示方法有关。因为它做了一些内部处理并调用了验证例程。它的验证结果构成了工具提示的主体。 当我替换child.Feature?.Tooltip方法,而只是从FindTooltip方法返回字符串“ My Tooltip”时,它将按预期工作。
对我来说,一个谜是,当我逐步执行FindToolTip方法时,可以看到实际的工具提示是按预期生成的。 方法中的一行显示“ Return tip”,我可以看到字符串变量“ tip”中填充了一些合适的字符串以及我希望它返回的字符串。
但是,当我继续逐步执行并返回到调用方法时,它不会越过
Dim results As String() = Await Task.WhenAll(tasks)
代码行。相反,它只是冻结在那条线上而拒绝前进。
这对我来说没有意义,因为我知道任务已经触发并且返回了字符串。那么,为什么不只完成例程并完成Await方法呢?
我在代码的其他部分使用了类似的“ Await Task.WhenAll(tasks)”例程,没有问题。
我会理解某种类型的赛车问题,但是,我已经完成了任务,并且知道它已经执行并返回了一个字符串。那为什么不结束呢?
有人可以帮助我了解造成此问题的原因吗?