2014-01-24 288 views
1

我剛開始學習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 
+0

關鍵是要知道,使用Async/Await時,一切都不會總是在後臺線程上運行,特別是在gui應用程序的情況下。通常情況下,系統不僅僅將任務排列在UI消息泵上,並且如果調度程序認爲這樣做有益,它將在UI線程上運行。 – stevethethread

回答

1

不要忽略編譯器警告。在這種情況下,編譯器會警告您,您的async方法不使用await,因此會同步運行。

就您而言,您可以使用Task.Run在後臺線程上執行func_for_task,並從您的點擊事件處理程序中執行await。請致電async/await intro on my blog

+0

Tnx很多,男人!現在我已經瞭解了等待/異步的基本想法,tnx對您的偉大文章!我可以把它推薦給所有的遊客。 – AsValeO