使用C# Winform做开发时间不短了,这次开发个简单的图片文件管理器软件遇到的问题还不少,继上次的 C# Winform FlowLayoutPanel 子控件重叠问题调查处理 问题后,又遇到了新问题:加载图片翻页时,总会出现加载中断卡在那里,只有关了软件,才会正常,但是用一段时间后,问题又再次出现。本地又不重现(最后发现是翻页次数少,没重现出来)。多次远程查看用户未发现问题,偶尔一次查看图片发现了异常:Error creating window handle
由于加载图片使用了多线程异步加载,一直在怀疑是多线程导致的并发死锁,但是又发现不出问题。卡在这里好几天。
今天想起了图上的异常错误信息,查了一下这个错误的相关信息:
可能的原因如下:
- 窗口句柄泄露,句柄数超过1W。
- 用户对象超过1W,错误提示“当前程序已使用了 Window 管理器对象的系统允许的所有句柄”。
查看句柄和用户对象数量的方法:
通过任务管理器(本人环境windows 10),详细信息,选择句柄、用户对象、GDI对象 ,来查看进程是否有异常, 一般报这个错误时,句柄数或用户对象都接近1W,而Windows对单个程序的句柄限制是1W。
通过以上方法看了一下任务管理器的用户对象数量果然达到了1W。
从这里意识到系统有某些对象未被释放,经调查测试将图片控件在翻页移除时,释放掉即可。