在重载操作中引入异步的简单方法

本文关键字:异步 简单 方法 重载 操作 | 更新日期: 2023-09-27 17:52:17

我正在开发一个WinForm应用程序,它必须在一开始就从云数据库加载大量数据。这将导致空白表单出现长达20秒的挂起。我已经尝试了一些方法,通过使用基于c++的加载屏幕来引导应用程序,但这些解决方案并不优雅,也不被团队领导所接受。我经常使用backgroundworker。下面是我的问题代码:

private void ConfigurePWR_Load(object sender, EventArgs e)
{
    try
    {
        // Initializing logging (2-5 second delay)
        // Initializing security manager (3-7 second delay)
        // Load data from DB (10-30 second delay)
        ReloadData(0);
    }
    catch (Exception exp)
    {
        UiElements.ShowErrorMessageBox(this, "Loading failure. Cannot continue.", exp);
        Close();
    }      
}
private void ReloadData(byte caseSelector)
{
    switch (caseSelector)
    {
        case 0:
            LoadConnectors();
            LoadPolicies();
            LoadOrganizationDirectories();
            LoadProxyConfig();
            break;
        case 1:
            LoadConnectors();
            break;
        case 2:
            LoadPolicies();
            break;
        case 3:
            LoadOrganizationDirectories();
            break;
        case 4:
            LoadProxyConfig();
            break;
    }
}

现在,每个Load*方法实际上是用一个数据源分配那个BindingSource。这就是对其中一个表单控件进行更改的地方。我试图以这样一种方式来处理异步,我在这里做了最少的改变。

有什么推荐的方法吗?上次我尝试Async-Await时,我最终编写了一个Async-Await的包装器,它在Async-Await上做得很好。这很快就会让人困惑。我不想重复,因为我有async关键字添加到几乎每个方法在我的表单的代码。

在重载操作中引入异步的简单方法

如果您的业务逻辑提供基于Task的异步api,请使用它们。如果没有,将其卸载到具有Task.Run的池线程以保持UI响应。如果同步操作花费大量时间,请使用Task.Factory.StartNew w/TaskCreationOptions.LongRunning而不是Task.Run。您可能也想观察取消。

我最近发布了一个WinForms应用程序的例子(这个概念本身并不特定于WinForms): https://stackoverflow.com/a/22497438/1768303.