并行处理不会从等待中返回

时间:2019-11-04 23:02:59

标签: .net vb.net async-await

我有一些.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)”例程,没有问题。

我会理解某种类型的赛车问题,但是,我已经完成了任务,并且知道它已经执行并返回了一个字符串。那为什么不结束呢?

有人可以帮助我了解造成此问题的原因吗?

0 个答案:

没有答案