【问题标题】:Await / async - async method runs in Main ThreadAwait / async - async 方法在主线程中运行
【发布时间】: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


【解决方案1】:

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

在您的情况下,您可以使用Task.Run 在后台线程上执行func_for_task,并在您的点击事件处理程序中使用await

有关详细信息,请参阅async/await intro on my blog

【讨论】:

  • Tnx 很多,伙计!现在我了解了 Await/Async 的基本概念,感谢您的精彩文章!我可以将它推荐给所有初学者。
猜你喜欢
  • 1970-01-01
  • 2021-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多