在重载操作中引入异步的简单方法
本文关键字:异步 简单 方法 重载 操作 | 更新日期: 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.