日期:2014-05-17  浏览次数:20996 次

我的Winform程序为什么爱死机?
我编写的一个Winform C#程序,里面用到串口(读数)操作,RFID读卡(用线程),海康威视摄像头显示几个实时画面,并设置了几个定时器。不知怎么搞得程序运行起来有时候会死机(无响应),点击界面上任何控件都没反应,经观察,死机时CPU的占用率比正常时要高出至少一倍。这种死机的故障查找起来真是无从下手,因为它毫无规律,有时运行一天都没事,有时半个小时就死几次。一般的故障可以通过设断点跟踪的方式来查找,像这种无规律死机的故障都不知道怎么去查。我以前碰到程序有死循环的代码,运行后界面反应迟钝,一个下拉框点好几次才勉强点开,并且图标常显示为沙漏,容易看出bug来;再有就是若是有零作为除数或将含有字母的数字字符串转换为整数或实数时若不加Try...Catch.....结构程序会直接退回桌面并报警等。其它的如内存垃圾回收之类的.net已经做得够好的了,一般不必操心。不知道各位高手有否碰到类似情形,遇到程序死机一般是什么缘因,如何去查找此类故障呢?谢谢!!

------解决方案--------------------
死锁也是有可能的。如果有异常的话看异常,没有的尝试一些固定会出错的操作,然后再调试。我的个人看法。
------解决方案--------------------
1、这种先检查下线程读取时,有没有锁住对象时没有解锁。
2、读数据是在循环里头读时,有没有延迟下,如用Thread.sleep(50)
3、你可以先把一些代码去除,一部分功能测试,最后定位在无响应的部分
------解决方案--------------------
这种无规律的界面卡死,是程序缺陷造成的,比较难用日志找到位置,
1.可以减少模块的运行来判断出现问题的模块。
2.不使用线程,或者使用少量线程看看,不要循环创建线程。
3.大量加回显保存在文本日志中。查看卡死时候还在写的日志。

不管那种方法都需要时间,经验和运气。
------解决方案--------------------
如果使用定时器,一定要考虑重入问题,正常情况下,timer中执行正常,
就怕异常情况下,某个周期中的函数未执行完,timer时间到了,再次触发timer事件,
这个时候就是灾难开始了。如果相关变量非线程安全,则出些奇奇怪怪的问题。
1.建议用线程替代timer
2.多加些运行过程日志,好找引起无响应的故障点
------解决方案--------------------
界面无响应,那肯定是UI的线程里某些代码执行很慢引起的。
要么就是在线程里没用委托操作UI界面里的控件引起的假死。
timer是在UI线程里跑的,检查之。不行就换线程来运行。

------解决方案--------------------
检查你解析串口数据那一部分!不要太相信串口数据的正确性,添加解析串口数据时对异常数据的处理!!是否是一场数据就要靠自己判断了!!
------解决方案--------------------
代码写得烂
没有运用好多线程