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

C# 在重载操作期间引入异步的简单方法,c#,winforms,entity-framework,async-await,.net-4.5,C#,Winforms,Entity Framework,Async Await,.net 4.5,我正在开发一个WinForm应用程序,它一开始就必须从云数据库加载大量数据。这会导致空白表单显示为挂起状态长达20秒。我尝试了一些方法,通过使用基于C++的加载屏幕来启动应用程序,但是解决方案并不优雅,团队领导无法接受。我经常和我的同事打交道。这是我的问题代码: private void ConfigurePWR_Load(object sender, EventArgs e) { try { // Initializing logging (2-5 second

我正在开发一个WinForm应用程序,它一开始就必须从云数据库加载大量数据。这会导致空白表单显示为挂起状态长达20秒。我尝试了一些方法,通过使用基于C++的加载屏幕来启动应用程序,但是解决方案并不优雅,团队领导无法接受。我经常和我的同事打交道。这是我的问题代码:

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关键字。

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


我最近发布了一个WinForms应用程序的例子(这个概念本身并不特定于WinForms):。

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


我最近发布了一个WinForms应用程序的例子(这个概念本身并不是WinForms特有的):.

返回一个任务怎么样?请给我一个关于这个的(y)文章的指针好吗?我现在正在看一些。似乎任务方法遵循了“物有所值”的概念。我希望设置数据源并启用控件。我将尝试放置一个加载屏幕来阻止任何交互。只是不要一个死气沉沉的UI。你不需要返回值,你不需要返回任务。像这样简单地添加异步是行不通的吗
private async void ConfigurePWR_Load(object sender,EventArgs e)
@hassanglzar nosertio在他的回答中写下了所有内容。返回一个任务怎么样?请给我一个指向这方面(y)文章的指针,好吗?我现在正在看一些。似乎任务方法遵循了“物有所值”的概念。我希望设置数据源并启用控件。我将尝试放置一个加载屏幕来阻止任何交互。只是不要一个死气沉沉的UI。你不需要返回值,你不需要返回任务。像这样简单地添加异步是行不通的吗
private async void ConfigurePWR_Load(object sender,EventArgs e)
@hassanglzar nosertio在他的回答中写下了一切。我看到了代码,我相信它会起作用,应该作为初学者模板提供给任何不熟悉async和TPL的人。不过,我需要做更多的研究,因为我正在对SQL数据库进行文本文件读取。我用的是块。因此,将文本文件中的200行逐行读取到一个代码内数据表中,然后在一个单独的方法中处理该数据表,该方法包含commit语句,只会终止UI。然后继续从文本文件读取,直到下一个200@HassanGulzar,希望有帮助。如果没有,请随时澄清任何要点。哦,这确实有帮助。我只是想知道我是否需要并行。因为我正在读取一个文本文件,并使用'file.ReadLines(_selectedDataFilePath).Count()'粗略了解总记录。@Hassanglzar,不,你不需要
并行。For
。它适用于计算密集型、CPU受限的工作<代码>任务。运行
就足够了。我看到了代码,我相信它会起作用,应该作为初学者模板提供给任何不熟悉async和TPL的人。不过,我需要做更多的研究,因为我正在对SQL数据库进行文本文件读取。我用的是块。因此,将文本文件中的200行逐行读取到一个代码内数据表中,然后在一个单独的方法中处理该数据表,该方法包含commit语句,只会终止UI。然后继续从文本文件读取,直到下一个200@HassanGulzar,希望有帮助。如果没有,请随时澄清任何要点。哦,这确实有帮助。我只是想知道我是否需要并行。因为我正在读取一个文本文件,并使用'file.ReadLines(_selectedDataFilePath).Count()'粗略了解总记录。@Hassanglzar,不,你不需要
并行。For
。它适用于计算密集型、CPU受限的工作<代码>任务。运行
就足够了。