软件功能描述:
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(这一条没有理论依据,猜测而已)