用于 winforms 的异步加载

本文关键字:加载 异步 winforms 用于 | 更新日期: 2023-09-27 18:34:32

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

由于我当前使用的数据库访问速度非常慢,因此我想在异步方法中使用数据库,以使用户能够在数据未完全加载和显示的情况下继续与界面交互。

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

我应该在哪里放置 await 关键字来完成此操作?我无法将其放在我的 Load 事件中,因为这需要完成才能使应用程序"正常"运行。

异步

方法是否有可能让 Windows 表单完全反应,而并非所有方法都完成,或者我是否为我的目的查看了"错误"的功能?

提前谢谢你。

编辑:根据Srirams的提示,我使加载事件本身成为异步潜艇,效果很好。下面是一些简单的示例代码,显示了所需的行为:

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

用于 winforms 的异步加载

我应该在哪里放置 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 控件,

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

您只需将 BackgroundWorker 控件

放在窗体上(在本例中为 backgroundWorker1(,BackgroundWorker 控件还支持取消、RunWorkerDone 等。

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);
}