Async/Await 似乎在 Winforms 中同步工作

Async/Await Seems to work synchronously in Winforms

提问人:Shuwaki Ibrahim 提问时间:11/3/2023 更新时间:11/11/2023 访问量:51

问:

我有一段代码,如下所示

Private Async Sub Form1_Load(sender as Object, e as EventArgs) Handles Form1.Load
   Await Load_DataAsync()
End Sub

Private Function Load_DataAsync as Task(Of Boolean)
  FetchData()
  Return Task.FromResult(True)
End Function

Private Sub FetchData()
  'Connects to Db and collect the data
End Sub

在UI响应能力方面,我看不出等待Load_DataAsync()和在没有await关键字的情况下调用它之间有任何区别。

我尝试了以下方法

Await Task.Run(Function()
                  Load_DataAsync()
               End Function)

并且应用程序在不阻塞 UI 的情况下继续进行

请问我做错了什么

vb.net 多线程 winforms .net-core async-await

评论

1赞 Panagiotis Kanavos 11/3/2023
问题中没有异步代码。 不会使方法本身在后台运行,它只是允许使用等待已经执行异步函数的语法糖asyncawait
1赞 Panagiotis Kanavos 11/3/2023
该怎么办?与其使用 不如使用异步数据库操作,例如 在不阻塞线程的情况下执行操作FetchDataawait Task.Run(FetchData)DbConnection.OpenAsync()DbCommand.ExecuteNonQueryAsync()
0赞 Craig 11/6/2023
Your 是正确的异步,因为它被声明了,它是它体内的东西。但是,your 没有正确异步,因为它在其主体中不执行任何操作并同步调用。另请参阅前面的评论,了解您应该执行哪些操作才能使其正确异步。Form1_LoadAsyncAwaitLoad_DataAsyncAwaitFetchDataFetchData

答:

0赞 Panos M 11/11/2023 #1

不阻止 UI 的一种方法是将操作作为任务运行。在你的情况下,正如你提到的,是正确的方法,否则你将在调用线程上运行。同样,正如其他人所评论的那样,建议使用异步数据库操作。Await Task.Run(Function() Load_DataAsync())FetchData()