任何人都可以解释为什么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()
答案 0 :(得分:1)
.Result
需要阻止,否则它不知道结果是什么。它甚至在the documentation中说明了这一点:
访问属性的get访问器会阻塞调用线程,直到异步操作完成;它相当于调用Wait方法。
请记住 - async / await不会改变你的陈述顺序。如果彼此之后有两个Console.WriteLine()
,那么它们将被执行的顺序。
async / await的美妙之处在于你有几个可以并行运行的Task
- 然后你可以同时等待它们。或者,如果在需要.Result
之前有更多的事情需要做,那么您可以先执行此操作并在结束时询问结果(以便任务与其他代码并行运行)。