我有一个C# WinForms应用程序。当主表单加载时,另外两个表单将被加载和隐藏,因为我需要它们在后台运行。为了能够访问它们,我保留了两个指向它们的全局变量。我希望将它们加载到一个单独的线程上,以减少加载时间。为此,我在主表单的构造函数中有以下代码:
if (!IsHandleCreated)
{
CreateHandle();
}
//Start the license manager using a separate thread.
new Thread(delegate()
{
BeginInvoke(new Action(() =>
{
GlobalVariables.licenseManagerWindow = new LicenseManager();
GlobalVariables.licenseManagerWindow.Show();
}));
bt_Licenses.BeginInvoke(new Action(() =>
{
bt_Licenses.Enabled = true;
}));
}).Start();
//Start the employee app manager using a separate thread.
new Thread(delegate()
{
BeginInvoke(new Action(() =>
{
GlobalVariables.employeeAppManagerWindow = new ManageEmployeeApp();
GlobalVariables.employeeAppManagerWindow.Show();
}));
bt_Employees.BeginInvoke(new Action(() =>
{
bt_EmployeeApp.Enabled = true;
}));
}).Start();问题是,在加载每个表单后,主窗体不是显示主窗体和更新按钮,而是如下所示,直到加载了其他两个窗体:

如您所见,这些控件不加载,并且它们以透明的方式显示。最后,当两个表单加载时,它们都加载得很好。如果我注释掉上面的代码,主表单将非常好地加载。显然,我不希望用户在表单加载时看到这个框架,而是希望看到控件。我做错什么了?
发布于 2014-10-30 10:18:25
尝试使用后台工作人员而不是线程。使用报表进度/ runworkercomplete事件将结果写入窗体。这样可以防止UI等待绘制,直到线程完成,并且使您不必手动处理控件的调用。
文档和示例可以在这里找到:http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker(v=vs.110).aspx
发布于 2014-10-30 13:21:18
不要在主表单的构造函数中加载两个隐藏的表单,而是在主窗体的“加载”事件处理程序中这样做。
Windows迫使您通过主线程加载隐藏表单(这就是BeginInvoke所做的),但是您可以通过让隐藏窗体从隐藏窗体的“加载”事件在后台线程上启动长期运行的网络通信来最小化对主线程的影响。
https://stackoverflow.com/questions/26649955
复制相似问题