Winform界面异步初始化

本文分析了WinForm应用在界面跳转时出现的长时间卡顿问题,原因是目标页面初始化资源过多。解决方案是延迟控件初始化,尝试使用多线程,但遇到ActiveX控件创建的问题。最后,通过Winform的Control.BeginInvoke实现异步加载界面,避免阻塞主线程,从而解决了卡顿问题。建议使用动态布局和异步方法来优化界面加载。
摘要由CSDN通过智能技术生成

问题描述:

       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);
       initThrea
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值