锁屏后重新登录程序无响应问题分析

14 篇文章 0 订阅

软件功能描述:

C# Winform以addin模式开发的一款实时数据库管理工具,功能模块以Dll方式生成,

在启动后通过反射加载。布局用到了大名鼎鼎的WeifenLuo.WinFormsUI.Docking(开源DockPanel)。

 

问题描述:

在完成部分功能升级后,测试人员报程序无响应bug。

具体症状为,打开程序,锁屏,然后重新登录,程序界面无响应,只能强行退出。

 

问题分析过程记录:

1. 回退修改代码,测试问题依旧,可推论之前版本同样存在问题。

2.怀疑DockPanel有bug,升级到2.9版本,问题依旧。

3. 将插件内容精简,发现一旦有toolstrip或者contextMenuStrip,就会导致无响应;

使用WeifenLuo.WinFormsUI.Docking例程加载自己开发的addin插件,则不会死锁,说明插件本身代码无明显异常;

删除所有插件,则不会发生无响应。

暂时将问题定位在反射加载form。

经讨论决定不再使用反射方法,直接加载addinform。

4.在确定方案后,开始整理代码。

仔细查看原来的winform加载过程,在program中实例化的是LoadingForm,这个form是用了显示加载插件信息及进度的。

LoadingForm加载过程中使用了backgroundworker,在加载完成后,即在backgroundworker的complete函数中new了MainForm,

然后显示。 MainForm form = new MainForm(plugDicts, connectEvent, formEvent, images);

-------------------

 MainForm的创建及使用有些欠斟酌,将MainForm的定义挪至 LoadingForm类声明中,

private MainForm form;

其他函数处理过程不变。

 

 这个修改无意间竟解决了无响应的问题,总结回顾下问题:

1. DockPanelSuite2.9功能非常强大,好用还开源。感谢原作者。

附上DockPanelSuite2.9的地址,http://www.nuget.org/packages/DockPanelSuite

2.与资源相关的处理一定要关注其生命周期,避免出现未初始化被调用,或者在被回收后仍然被访问。

3. GC机制在不确定的时间执行,设计不当的代码会出现奇奇怪怪的异常。

4. 系统锁屏可能会触发GC(这一条没有理论依据,猜测而已)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值