我剛開始學習Async/Await,並且遇到了問題。有一個WinForms應用程序與2個按鈕和永久運行狀態欄上。當按下第一個按鈕時 - 一直很好 - 在另一個線程中運行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時,一切都不會總是在後臺線程上運行,特別是在gui應用程序的情況下。通常情況下,系統不僅僅將任務排列在UI消息泵上,並且如果調度程序認爲這樣做有益,它將在UI線程上運行。 – stevethethread