试试 async/await
多线程处理应该效果差不多,问题是我这种界面假死,但是资源管理器显示运行,这个到底是线程卡死导致的,还是更新控件卡死的,我不太清楚,求助
事件委托不能解决界面假死的问题。但单线程下可以用Application.DoEvents() 试试,让系统有时间更新界面。比较长时间的处理应建议用多线程处理,虽然多线程更新界面麻烦些。
@万事如意-: 长任务用多线程处理,界面不会假死, 线程处理任务时,界面可以随意拖动。
我的程序正常运行是没有问题的,就是过了几天后发现假死了不能拖动,但是实际上其他非UI线程还是在正常运行的,我现在不确定到底是线程卡死导致的问题还是控件更新导致的问题,求教,有没有遇到这样的情况
@万事如意-: 在UI和线程加入log跟踪一下
都加过了,try catch 都没有异常发现
在你的界面不起眼的地方,加一个label. 后台新起一个线程, 用这个线程每1秒获取一下当前时间,用委托更新到label上 . winform 的程序貌似在界面长时间无刷新的情况下会进入假死状态. 我一般写界面程序的时候都会加上这么一个时间.
我界面上有加上时间的,是winform timer 然后用event 去更新时间的,假死时时间也不动了,我
查看当时时间点log 也没有发现任何异常抛出
@万事如意-: 把定时器换成线程试试呢
试过了,改成线程后时间是可以正常显示了,但是主界面还是假死,应该可以确定是UI线程被哪里卡住了,所以现在我把所有需要更新的控件都用委托做了处理,可是还是偶尔会假死,不知道该怎么调试了,
Winform 自己类型中的timer 应该会处理很好吧,不至于自己卡主,就算卡住了,等待一会也应该可以好,不应该一直拉着无法拖动
@万事如意-: 你别的地方还有用timer的地方没,看下timer是引用的哪个,winform里面有3个timer,用的是线程下面的那个么
没有,用system thread timers time ,显示时间就是控件里面那个timer Winform timer
@万事如意-: 额....那我唯一能想到的就只能是,挨个的删控件,看看是哪个控件更新引起的假死了...
所以你是觉得是控件更新导致的问题吗?
@万事如意-: 现在不确定,就是挨个的删除方法,取消更新控件,用排除法来查找问题
关健没有办法验证,有时候几天才发生一次
程序假死,说明有主线程正在运行计算什么的,在计算结束之后,才会操作,你试试吧所有的都用线程来做
关键主线程并不没有计算处理什么大的数据或者逻辑,如果是计算处理时间长的问题,至少等一会就可以响应过来的,我现在是一直都是假死的现象
有没有.Net 大神可以点拨一下,感谢
可能是程序问题,要检查代码。如果一个加载数据的方法没有新开现场,那么在数据操作的时候,你也程序页面会假死。
请问你的问题解决了吗?我最近也碰到相同的情形了
请问你的解决了没