我正在开发一个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关键字添加到我的表单代码中的每个方法中。
答案 0 :(得分:4)
如果您的业务逻辑提供基于Task
的异步API,请使用它们。如果没有,请将其卸载到Task.Run
的池线程,以保持UI响应。如果同步操作需要大量时间,请使用Task.Factory.StartNew
w / TaskCreationOptions.LongRunning
代替Task.Run
。您也可能希望观察取消。
我最近为WinForms应用程序发布了一个示例(该概念本身并不特定于WinForms):https://stackoverflow.com/a/22497438/1768303。