在重负载操作期间引入异步的简单方法

时间:2014-03-23 09:20:38

标签: c# winforms entity-framework async-await .net-4.5

我正在开发一个WinForm应用程序,它必须从一开始就从云数据库加载大量数据。这会导致空白表格挂起长达20秒。我已经尝试了几种方法来使用基于C ++的加载屏幕来捕获应用程序,但解决方案并不优雅,并且不被团队领导接受。我经常使用BachgroundWorker。这是我的问题代码:

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关键字添加到我的表单代码中的每个方法中。

1 个答案:

答案 0 :(得分:4)

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

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