Async / Await回调行为

时间:2018-03-17 11:05:12

标签: vb.net

任何人都可以解释为什么Console.WriteLine(t.Result)行“阻止”下一行"I am done"?根据我的理解,如果代码中显示t.Wait(),这对我来说是明白的,但在这种情况下,似乎t.Results充当等待自己。到达行Dim urlContents As String = Await getStringTask时,对于我,它应该回调(因为等待)到Main函数并直接前进到行Console.WriteLine("I am done"),除非t.Wait()将被取消注释。我错过了什么?

Sub Main()
      Dim t = Task.Run(Function()
                   Return AccessTheWebAsync()
               End Function)

      't.Wait() 

      Console.WriteLine(t.Result)
      Console.WriteLine("I am done")

      Console.ReadLine()
End Sub


Async Function AccessTheWebAsync() As Task(Of Integer)
      Dim getStringTask As Task(Of Integer) = Task.Run(Async Function()
                           Await Task.Delay(6000)
                                 Return 999999
                           End Function)

            DoIndependentWork()

      Dim urlContents As String = Await getStringTask 
      Return urlContents.Length
End Function

Sub DoIndependentWork()
      Console.WriteLine("DoIndependentWork...")
End Sub

确认: t.Result = t.Wait()

1 个答案:

答案 0 :(得分:1)

.Result需要阻止,否则它不知道结果是什么。它甚至在the documentation中说明了这一点:

  

访问属性的get访问器会阻塞调用线程,直到异步操作完成;它相当于调用Wait方法。

请记住 - async / await不会改变你的陈述顺序。如果彼此之后有两个Console.WriteLine(),那么它们将被执行的顺序。

async / await的美妙之处在于你有几个可以并行运行的Task - 然后你可以同时等待它们。或者,如果在需要.Result之前有更多的事情需要做,那么您可以先执行此操作并在结束时询问结果(以便任务与其他代码并行运行)。