async / await和ContinueWith之间的差异

时间:2016-10-26 18:52:43

标签: vb.net

考虑这个例子:

 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

1 个答案:

答案 0 :(得分:1)

Await确实使用了ContinueWith。但是,ContinueWith is a dangerous API并且不应该直接使用。正如我在task continuations的帖子中描述的那样:

  • ContinueWith有一个不幸的默认情景选择;它使用TaskScheduler.Current而不是TaskScheduler.Default
  • ContinueWith无法理解异步委托,因此它将返回一个必须解包的额外任务包装器(通过调用Unwrap)。
  • ContinueWith没有适当的默认选项参数用于异步代码(例如TaskContinuationOptions.DenyChildAttachTaskContinuationOptions.ExecuteSynchronously)。

出于这些原因,您应该使用Await而不是ContinueWith来获取异步代码。

此外,它更短更漂亮。 :)