等待 /异步 - 异步方法在主线程中运行



我刚开始学习异步/等待,我有一个问题。有一个带有2个按钮的Winforms应用程序,并在其上永久运行状态键。按下第一个按钮时 - 拔出效果很好 - 在另一个线程中运行cicle,UI不会冻结。按下第二个cicle在主线程中运行时,ui冻结。我只是无法理解!为什么?对我来说,这种方法看起来几乎相同。顺便说一句,我的英语不好。

 Public Class Form1
    'Async - Create Task from Sync Method
    Private Async Sub btn_async_from_sync_Click(sender As Object, e As EventArgs) Handles btn_async_from_sync.Click
        Dim tsk As New Task(Of Integer)(AddressOf func_for_task)
        tsk.Start()
        Dim val As Integer = Await tsk
        MsgBox(val)
    End Sub
    Private Function func_for_task() As Integer
        Dim val As Integer
        For i = 1 To 999999999
            val += 1
        Next
        Return val
    End Function
    'Async - Use existing Task - Async Method
    Private Async Sub btn_async_use_task_Click(sender As Object, e As EventArgs) Handles btn_async_use_task.Click
        Dim tsk As Task(Of Integer) = func_for_task_async()
        Dim val As Integer = Await tsk
        MsgBox(val)
    End Sub
    Private Async Function func_for_task_async() As Task(Of Integer)
        Dim val As Integer
        For i = 1 To 999999999
            val += 1
        Next
        Return val
    End Function
End Class

不要忽略编译器警告。在这种情况下,编译器会警告您您的async方法不使用await,因此会同步运行。

在您的情况下,您可以使用Task.Run在背景线程上执行func_for_task,然后从单击事件处理程序中进行await

有关更多信息,请参阅我的博客上的async/await介绍。

最新更新