【发布时间】:2014-12-18 11:05:00
【问题描述】:
在 (Android) 应用程序中,在用户与界面交互时加载和构建 ListViews 是很常见的。然而,在 Winforms 中,趋势似乎是单击按钮并等待结果完全加载,然后用户才能继续在应用程序中导航。
由于我当前使用的数据库访问速度很慢,我想在异步方法中使用数据库,以使用户能够在数据未完全加载和显示的情况下继续与界面交互。
例如,我想在我的 Form_Load 事件中启动一个异步方法来继续收集数据。当这个方法完成时,我想将数据绑定到一些控件——这(现在)根本不会改变功能。因此,我希望用户在处理应用程序时不要注意到任何差异(除了是否显示数据)。
我应该在哪里放置 await 关键字来完成此操作?我不能将它放在我的 Load 事件中,因为这需要完成才能使应用程序“正常”运行。
是否甚至可以使用异步方法让 Windows 窗体完全反应而并非所有方法都完成,或者我是否出于我的目的查看“错误”功能?
提前谢谢你。
编辑:根据 Srirams 的提示,我将 load-event 本身设置为一个运行良好的异步 sub。下面是一些显示所需行为的简单示例代码:
Public Class DelayedLoadingWindow
Private Async Sub DelayedLoadingWindow_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim awaitedResultOne As Task(Of String) = GetDataOneAsync()
Label1.Text = Await awaitedResultOne
Dim awaitedResultTwo As Task(Of String) = GetDataTwoAsync()
Label2.Text = Await GetDataTwoAsync()
Dim awaitedResultThree As Task(Of String) = GetDataThreeAsync()
Label3.Text = Await GetDataThreeAsync()
Me.Text = "DONE"
End Sub
Public Async Function GetDataOneAsync() As Task(Of String)
Await Task.Delay(2000)
Return "Async Methods"
End Function
Public Async Function GetDataTwoAsync() As Task(Of String)
Await Task.Delay(2000)
Return "are"
End Function
Public Async Function GetDataThreeAsync() As Task(Of String)
Await Task.Delay(2000)
Return "running!"
End Function
End Class
【问题讨论】:
-
为什么不使用
BackgroundWorker? -
@H W:我已经用测试项目检查了我的代码并且它运行良好。
标签: c# .net vb.net asynchronous visual-studio-2013