1

방금 ​​Async/Await을 배우기 시작했는데 문제가 있습니다. WinForms App에는 2 개의 버튼이 있으며 상태 표시 줄이 영구적으로 실행됩니다. 첫 번째 버튼을 누를 때 - everithing은 다른 스레드에서 실행되고 UI는 고정되지 않습니다. Main Thread에서 second-cicle을 누르면 UI가 멈 춥니 다. 나는 그것을 얻을 수 없다! 왜? 나에게이 방법은 거의 비슷하게 보인다. Btw 내 나쁜 영어를 부르다.Await/async-async 메서드가 주 스레드에서 실행됩니다.

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 많이, 남자 !! 이제는 Await/Async, tnx라는 훌륭한 아이디어를 얻었습니다. 나는 모든 초심자에게 그것을 추천 할 수있다. – AsValeO

관련 문제