C# 在重载操作期间引入异步的简单方法
我正在开发一个WinForm应用程序,它一开始就必须从云数据库加载大量数据。这会导致空白表单显示为挂起状态长达20秒。我尝试了一些方法,通过使用基于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
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受限的工作<代码>任务。运行
就足够了。