异步/等待未产生异步效果

时间:2019-08-02 07:39:44

标签: vb.net async-await

异步/等待无效,

我认为label1应该立即执行。

 Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Await Task.Run(Sub()
                           Threading.Thread.Sleep(3000)
                       End Sub)
        Label1.Text = "123"
    End Sub

2 个答案:

答案 0 :(得分:6)

我认为您误解了Async/Await应该如何工作。在您的代码中:

 Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Await Task.Run(Sub()
                       Threading.Thread.Sleep(3000)
                   End Sub)
    Label1.Text = "123"
 End Sub

label1在3秒延迟结束之前不会改变。您的事件处理程序将等待任务,然后继续执行并更改标签。但是Async/Await绝对有作用。

将您的代码与此代码进行比较:

 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    threading.Thread.Sleep(3000)
    Label1.Text = "123"
 End Sub

与代码中的情况相同:3秒钟后,标签将更改。但是,两者之间存在巨大差异。在您的代码中,Async/await版本的用户界面不会阻塞,这意味着您可以按另一个按钮,那里的代码仍将立即执行。

Await表示正在进行一个长任务,并且UI线程将不会继续执行sub,直到该任务完成(在另一个线程中)。完成后,UI线程将在其左侧的位置拾取并更新标签。

答案 1 :(得分:3)

似乎如下,并且代码更像是异步的

  Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        Dim action1 As Action = New Action(Sub()
                                               Threading.Thread.Sleep(3000)
                                           End Sub)
        action1.BeginInvoke(Nothing, Nothing)
        Label1.Text = "123"


    End Sub