我刚开始学习异步/等待,我有一个问题。有一个带有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
介绍。