winforms的异步加载

在(Android)应用程序中,在用户与界面交互时加载和构建ListView是很常见的。 然而,在Winforms中,趋势似乎是在用户可以继续浏览应用程序之前单击按钮并等待结果完全加载。

由于我目前使用的数据库访问速度很慢,我想在异步方法中使用数据库,以使用户能够与接口保持交互,而数据未完全加载和显示。

例如,我想在我的Form_Load事件中启动一个异步方法来继续收集数据。 当此方法完成时,我想将数据绑定到某些控件 – 这将(暂时)不会更改function。 因此,我希望用户在处理应用程序时不要注意到任何差异(除了显示或不显示数据)。

我应该在哪里放置await关键字来实现这一目标? 我不能将它放在我的Load事件中,因为这需要完成以使应用程序“正常”运行。

甚至可以使用异步方法让Windows窗体完全反应,而不是所有方法都完成,或者我是否正在为我的目的查看“错误”function?

先感谢您。

编辑:在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 

我应该在哪里放置await关键字来实现这一目标? 我不能将它放在我的Load事件中,因为这需要完成以使应用程序“正常”运行。

为什么你不能等待内部加载事件处理程序? 如果使用async修饰符标记方法,则可以执行此操作。

 private async void Form_Load(object sender, EventArgs e) { //Do something var data = await GetDataFromDatabaseAsync(); //Use data to load the UI } 

这样,您可以保持UI响应,并异步执行耗时的工作。 GetDataFromDatabaseAsync必须是异步的(不应该阻塞调用线程)。

如果这不能回答您的问题,请更具体。

您可以使用BackgroundWorker Control,

http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker(v=vs.110).aspx

您需要将BackgroundWorker Control放在表单上(在我们的示例中为backgroundWorker1),BackgroundWorker Control还支持取消,RunWorkerCompleted等。

 private SlowLoadingForm frm; private void startAsyncButton_Click(object sender, EventArgs e) { backgroundWorker1.RunWorkerAsync(); } private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { frm = new SlowLoadingForm(); frm.show(); Application.Run(frm); }