H W*_*H W 1 .net c# vb.net asynchronous visual-studio-2013
在(Android)应用中,在用户与界面交互时加载和构建ListView是很常见的。但是,在Winforms中,趋势似乎是单击按钮并等待结果完全加载,然后用户才能继续浏览应用程序。
由于我当前正在使用的数据库访问速度很慢,因此我想在异步方法中使用数据库,以使用户能够在数据未完全加载和显示的同时继续与接口进行交互。
例如,我想在我的Form_Load事件中启动一个异步方法以保持收集数据。此方法完成后,我想将数据绑定到某些控件-暂时不会更改任何功能。因此,我希望用户在处理应用程序时不要注意到任何区别(除了显示的数据与否)。
我应该在哪里放置await关键字来完成此操作?我无法将其放在Load事件中,因为这需要完成,应用程序才能“正常”运行。
甚至有可能使用异步方法使Windows窗体完全反作用而并非所有方法都完成,或者我是否出于自己的目的考虑“错误”功能?
先感谢您。
编辑:按照Srirams提示,我使load-event本身成为一个异步子程序,效果很好。这是一些简单的示例代码,显示了所需的行为:
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
Run Code Online (Sandbox Code Playgroud)
我应该在哪里放置await关键字来完成此操作?我无法将其放在Load事件中,因为这需要完成,应用程序才能“正常”运行。
您为什么不能在加载事件处理程序中等待?如果使用async修饰符标记方法,则可以执行此操作。
private async void Form_Load(object sender, EventArgs e)
{
//Do something
var data = await GetDataFromDatabaseAsync();
//Use data to load the UI
}
Run Code Online (Sandbox Code Playgroud)
这样,您可以使UI保持响应,还可以异步执行耗时的工作。GetDataFromDatabaseAsync必须是异步的(不应阻塞调用线程)。
如果这不能回答您的问题,请更具体。