首页 新闻 搜索 专区 学院

C#如何寻找出软件卡死的问题?无异常报错!

0
[已解决问题] 解决于 2020-04-26 14:57

用C#写了一个Window窗体软件,软件没有出现异常报错,直接卡死。窗体按钮什么都按不到,关闭也关不了!请问有什么可能性会导致软件直接卡死??????
软件有一个循环体,多线程读写操作表格。

😀明笔记的主页 😀明笔记 | 初学一级 | 园豆:29
提问于:2020-04-21 17:50
< >
分享
最佳答案
1

代碼中增加文字log,寫到一個.txt
看看log停在哪裡

奖励园豆:5
RosonJ | 老鸟四级 |园豆:3763 | 2020-04-21 17:59

代码量很大哦。而且还是多线程,log会不会有点不易操作??

😀明笔记 | 园豆:29 (初学一级) | 2020-04-21 18:54

@😀明笔记:
除錯用而已,簡單分割標示程序進行到哪個階段
用完就拿掉

RosonJ | 园豆:3763 (老鸟四级) | 2020-04-21 20:51

@RosonJ: 6个线程哦。有点难搞

😀明笔记 | 园豆:29 (初学一级) | 2020-04-21 21:05

@RosonJ: 而且是独立互不影响的,最终都作用于一个表格里

😀明笔记 | 园豆:29 (初学一级) | 2020-04-21 21:05

@😀明笔记:
對同一個表格作用,應該會有lock問題吧

RosonJ | 园豆:3763 (老鸟四级) | 2020-04-22 09:17

@RosonJ: lock加了。如果不加或者少加了会怎样?

😀明笔记 | 园豆:29 (初学一级) | 2020-04-22 09:18

@😀明笔记:
總共6個線程,第一個線程加了鎖,其他五個就無法讀寫(讀也許可以),
換句話說,同一個瞬間,只能有一個線程在工作,另外五個只能等待
我認為這很有可能就是導致程序緩慢,看起來像卡死的原因

RosonJ | 园豆:3763 (老鸟四级) | 2020-04-22 09:30

@RosonJ: 但是线程都停止工作了。软件等待了很久还是没有反应哦。按道理来说,应该是卡死一段时间就处理完了把?

😀明笔记 | 园豆:29 (初学一级) | 2020-04-22 09:31

@😀明笔记:
如何確定線程工作都處理完了?

RosonJ | 园豆:3763 (老鸟四级) | 2020-04-22 09:33

@RosonJ: 处理完界面会返回结果的(按钮变绿之类的),但是按钮一直没有变绿。

😀明笔记 | 园豆:29 (初学一级) | 2020-04-22 09:34

@😀明笔记:
你說線程都停止工作,但工作卻還沒有處理完(因為按鈕還沒有變綠)
這不就跟我說的一樣,線程在等待,所以工作沒做完卻暫停

RosonJ | 园豆:3763 (老鸟四级) | 2020-04-22 09:39

@RosonJ: 你的意思是。线程等待太多会导致卡顿?比如6个线程都写数据到dgv表格里,5个线程都在等待的话。就会卡死?

😀明笔记 | 园豆:29 (初学一级) | 2020-04-22 09:45

@😀明笔记:
是的,但問題不在線程的數量
而是,目標表格只有一個,為什麼需要使用多線程?

RosonJ | 园豆:3763 (老鸟四级) | 2020-04-22 09:49

@RosonJ: 因为项目需求要收集6个仪器的数据到表格里,而且是在一条流水线上,都是靠通讯的方式获取数据,然后线程操作到表格里

😀明笔记 | 园豆:29 (初学一级) | 2020-04-22 09:51

@RosonJ: 目标只有表格一个。只要加了lock应该没问题的把?

😀明笔记 | 园豆:29 (初学一级) | 2020-04-22 09:52

@😀明笔记:

  1. 一條線程也可以收集六個儀器的數據不是嗎?
  2. 加了lock確保寫入的數據沒問題,但同時卻會造成其他線程的等待,你的鎖不釋放出來,其他線程就無法寫入,這樣可以理解嗎?
RosonJ | 园豆:3763 (老鸟四级) | 2020-04-22 09:55

@RosonJ: 2个串口通讯(相当于两个线程把)还有4个TCP通讯(这里有四个接受线程)、这6个线程合并不了把??
锁的话。肯定会释放的。写完数据就释放

😀明笔记 | 园豆:29 (初学一级) | 2020-04-22 09:58

@😀明笔记:
如果是這樣,那問題就在於,你的代碼是如何判斷六個線程的工作都完成了?

RosonJ | 园豆:3763 (老鸟四级) | 2020-04-22 10:00

@RosonJ: 这个确实不清楚是否都完成了。-我加个日志看看

😀明笔记 | 园豆:29 (初学一级) | 2020-04-22 10:15
其他回答(4)
1

委托+线程 +sleep 吧

Cgrain | 园豆:1089 (小虾三级) | 2020-04-21 19:40

那最终执行完。软件应该会恢复的把?为什么一直卡死呢?

支持(0) 反对(0) 😀明笔记 | 园豆:29 (初学一级) | 2020-04-21 19:42

@😀明笔记: 你这个程序主要是干啥的? 时间比较久

支持(0) 反对(0) Cgrain | 园豆:1089 (小虾三级) | 2020-04-21 19:45

一般直接卡死,就是数据量比较大,磁盘读写不够.

支持(0) 反对(0) Cgrain | 园豆:1089 (小虾三级) | 2020-04-21 19:53

@Cgrain: 接受2个串口数据和4个TCP发送过来的数据,并进行汇总到datagridview表格里

支持(0) 反对(0) 😀明笔记 | 园豆:29 (初学一级) | 2020-04-21 21:04

@😀明笔记: 你只是用线程接收数据,没用委托+线程显示数据到 datagridview ?

支持(0) 反对(0) Cgrain | 园豆:1089 (小虾三级) | 2020-04-21 21:47

@Cgrain: 有,线程里有委托

支持(0) 反对(0) 😀明笔记 | 园豆:29 (初学一级) | 2020-04-22 08:45

@😀明笔记: 你把 汇总到的 datagridview 数据,写入记事本,看看卡不卡,如果不卡的话,就是在重绘datagridview 的时候读写速度跟不上,否则就是数据量来的太快,太大,写入跟不上

支持(0) 反对(0) Cgrain | 园豆:1089 (小虾三级) | 2020-04-22 08:58

@Cgrain: 汇总数据到dgv的时候,也同时会写入表格里的。读写速度跟不上,会导致软件直接卡死不动了??只能强行任务管理器退出

支持(0) 反对(0) 😀明笔记 | 园豆:29 (初学一级) | 2020-04-22 09:00

@😀明笔记: 你跑的时候打开任务管理器啊 看看,磁盘使用,CPU使用效率

支持(0) 反对(0) Cgrain | 园豆:1089 (小虾三级) | 2020-04-22 10:22

@Cgrain: CPU使用率太高的话。是不是电脑的其他软件也会跟着卡?目前只发现只是我写的软件卡死,电脑其他的软件不会卡哦,这样是不是排除了CPU使用率太高的原因了?

支持(0) 反对(0) 😀明笔记 | 园豆:29 (初学一级) | 2020-04-22 10:29

@😀明笔记: 不一定啊,相当于你 的这个winform 是一个进程,其他软件又是一个进程,只不过是你这个进程资源占用大

支持(0) 反对(0) Cgrain | 园豆:1089 (小虾三级) | 2020-04-22 11:27

@Cgrain: 哦!了解!

支持(0) 反对(0) 😀明笔记 | 园豆:29 (初学一级) | 2020-04-23 10:04
0

设断点,写日志。看看哪里卡住了

会长 | 园豆:8990 (大侠五级) | 2020-04-22 09:40

已经加上了,只是这个问题是偶然性的,现在还没出现问题-

支持(0) 反对(0) 😀明笔记 | 园豆:29 (初学一级) | 2020-04-23 10:05
0

 即使代码不是自己的,一般调试工具也就能查看出来,在看不出来就CLR Profile,再不行winDbg。

花飘水流兮 | 园豆:11575 (专家六级) | 2020-04-22 20:32

调试没问题,没有报错,直接就是卡着界面

支持(0) 反对(0) 😀明笔记 | 园豆:29 (初学一级) | 2020-04-23 10:05
0

一定是线程出现的异常,导致UI卡死

烟雨客 | 园豆:174 (初学一级) | 2020-04-26 18:12
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册