考虑这个例子:
Private Async Function ComputeText() As Task(Of String)
Dim result As String = Await Task.Run(Function()
'do whatever
Return "Done"
End Function)
Return result
End Function
现在有人能告诉我这两个按钮事件处理程序之间是否存在差异?从我的角度来看,这是相同的,但更好的方法'是使用第一个,我是对的吗?
'1st:
Private Async Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
LabelCounter.Text = "Running"
Dim value As string = Await ComputeText()
LabelCounter.Text = value
End Sub
'2nd:
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
LabelCounter.Text = "Running"
Dim task = ComputeText().ContinueWith(
Sub(x)
LabelCounter.Invoke(
Sub()
LabelCounter.Text = x.Result
End Sub)
End Sub)
End Sub
答案 0 :(得分:1)
Await
确实使用了ContinueWith
。但是,ContinueWith
is a dangerous API并且不应该直接使用。正如我在task continuations的帖子中描述的那样:
ContinueWith
有一个不幸的默认情景选择;它使用TaskScheduler.Current
而不是TaskScheduler.Default
。ContinueWith
无法理解异步委托,因此它将返回一个必须解包的额外任务包装器(通过调用Unwrap
)。ContinueWith
没有适当的默认选项参数用于异步代码(例如TaskContinuationOptions.DenyChildAttach
和TaskContinuationOptions.ExecuteSynchronously
)。出于这些原因,您应该使用Await
而不是ContinueWith
来获取异步代码。
此外,它更短更漂亮。 :)