问题描述:
WinForm系统在系统跳转过程中出现了长时间的卡顿现象(10s),这样长时间的界面卡顿显然是不被允许,界面跳转控制在1s以内还是可以接受的。
问题分析:
造成这样的卡顿应该是目标页面需要初始化的资源过多造成的,分析了一下目标页面的布局,总共包含四个控件:一个ToolStripContainer,一个AxMapControl,一个ToolBar 和N多个ToolStripButton。
而这些控件都是在可视化布局视图中通过拖拽控件布局的,对应的初始化代码均在InitComponent()中完成,而这个函数是在Load之前,在跳转之前的卡顿肯定是必然的了。
解决办法:
解决这个问题自然想到的就是延迟目标页面控件的初始化,在页面加载完成后再进行内部页面的生成。我首先采用的办法是使用多线程方法,即在Load事件响应中声明一个线程,让该线程负责后续控件的生成,但是该方法会造成下图的问题:当前线程不在单线程单元中无法实例化ActiveX控件(AxMapControl是一个ActiveX控件)。这个是因为COM对象的套间问题(套间是深入浅出COM中提到的翻译),那么将线程模型改为单套间呢?
private void SpatialMainControl_Load(object sender, EventArgs e)
{
Thread initThread = new Thread(new ThreadStart(InitControl));
initThread.SetApartmentState(ApartmentState.STA);
initThread.Start();
}
调用 initThread.SetApartmentState(ApartmentState.STA);将当前