【发布时间】:2014-01-24 07:48:50
【问题描述】:
我刚开始学习 Async/Await,但遇到了问题。有一个带有 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 时,一切都不会总是在后台线程上运行,尤其是在 gui 应用程序的情况下。很多时候,系统不仅会在 UI 消息泵上对任务进行排队,而且如果调度程序认为这样做是有益的,它会在 UI 线程上运行。
标签: multithreading user-interface asynchronous task async-await