c# winform程序运行一段时间后假死 && 页签切换不流畅问题

创创创创。创健 2017-06-20 10:35:48
所出现的问题:
程序挂着不动,一开始没问题(起码一个小时内没问题),挂了一晚上早上起来发现程序假死了,任务管理器并没有显示无响应确实是在运行着的,但是页面点不动,也无法关闭。

程序大致内容:
使用定时器(Timer.timer),定时去执行一个代理delegate,然后将一个backgroundworker的doWork事件交给这个代理,最后使用this.beginInvoke();启动。大致代码结构如下:

private delegate void Delegate_1();
//timer定时执行的事件
private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) {
Delegate_1 del = new Delegate_1(timer_do);
this.BeginInvoke(del);
}
private void timer_do() {
if (this.backgroundWorker.IsBusy) return;
this.backgroundWorker.RunWorkerAsync();
}
private void backgroundWorker_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e) {
//会耗时的http请求
......
}

自己是java开发的,一个朋友拜托做个C#的小应用,我就想帮帮忙,C#完全是0基础自学,很多问题能搜查出来的也都能自己解决,但是一些比较深层的内容就需要各位大神帮忙指点一下了。拜托大家了。
...全文
1080 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 4 楼 duanzi_peng 的回复:
如果你的 http请求 一直处于无应答状态就会导致一直请求,造成UI线程阻塞,对于请求失败需要做一些处理,比如请求超时了,要释放到无用资源。 timer不能一直运行,应在http请求的时候进行控制,开始请求就停止timer,http应答完毕就重新启动timer, 失败的情况就应该重新启动timer。
按照你的说法,确实挂了一晚上再也没有出现了假死了,真的感谢了。同时感谢其他朋友。 那我就直接在这再说一个问题希望你帮忙解惑一下: 主winform上有多个userController,通过点击按钮来切换显示不同的userController,但是有几个疑问 1、我是先clear掉所有的userController,再new一个需要显示的;还是先hide所有的userController,再把需要显示的show出来呢?虽然结果是一样的,但是哪一种更适合呢? 2、我的每个userController上,通过http请求返回数据之后,遍历List循环new label,然后将label ADD到userController上显示。这个地方会导致页面间切换卡顿(切换的时候不重新请求),也就是说多个有很多label的userController间的切换卡顿,目前切换使用的是show和hide。请问这个有什么解决办法么,请赐教。
bloodish 2017-06-21
  • 打赏
  • 举报
回复
引用 7 楼 qq_33582552 的回复:
[quote=引用 3 楼 bloodish 的回复:] 再放些代码上来,好做分析
也就是说,第一次请求如果得不到及时响应,timer下一次请求又来了,就会有许多请求阻塞在那里,会导致资源未释放?是这个意思嘛[/quote] 不是这个意思, 因为按你的代码逻辑,如果DoWork没有执行完, BackgroudWorker.IsBusy是true,Timer再次请求也没有关系,因为你直接return了. 除非是一次DoWork结束之后还有资源没释放.
  • 打赏
  • 举报
回复
引用 12 楼 xuzuning 的回复:
任务管理器并没有显示无响应确实是在运行着的,但是页面点不动,也无法关闭。 第一反应就是资源耗尽 所以我让你检查:有资源未释放 其次才是 被 timer 驱动的程序 你在做 java 时,难道不也是这样吗?
不好意思我是java'web的,资源管控需要注意的比较少,做了C#才知道资源管控很重要。 你这样说的话我觉得有一个可能: 页面显示的时候,是在循环中new 的label,然后ADD进去的。点击刷新,我把userController所有label给clear掉,然后再次循环new label。 这个clear会不会释放资源呢?要怎么处理掉上一次页面中所有的label让他们不在占用资源呢?
超级路灯 2017-06-21
  • 打赏
  • 举报
回复
首先的资源没有释放,然后应该用多线程
xuzuning 2017-06-21
  • 打赏
  • 举报
回复
任务管理器并没有显示无响应确实是在运行着的,但是页面点不动,也无法关闭。 第一反应就是资源耗尽 所以我让你检查:有资源未释放 其次才是 被 timer 驱动的程序 你在做 java 时,难道不也是这样吗?
  • 打赏
  • 举报
回复
引用 10 楼 xuzuning 的回复:
停止timer,没有假死,但也没有做什么事情 本来可能并行完成的工作,现在是串行完成了
其实我有个疑问,对于之前的timer请求http阻塞的情况,如果说是上一次请求还未返回,下一此timer的请求又来了,大量的请求阻塞导致UI假死。实际上我的timer是1分钟一次,http设置的timerout是20秒,理应一次请求20秒还未收到结果的话,就会走掉,并不会造成阻塞呀。 虽然问题这样处理过后解决了,但是这个原理还不太懂,望赐教,谢谢
xuzuning 2017-06-21
  • 打赏
  • 举报
回复
停止timer,没有假死,但也没有做什么事情 本来可能并行完成的工作,现在是串行完成了
exception92 2017-06-20
  • 打赏
  • 举报
回复
如果你的 http请求 一直处于无应答状态就会导致一直请求,造成UI线程阻塞,对于请求失败需要做一些处理,比如请求超时了,要释放到无用资源。 timer不能一直运行,应在http请求的时候进行控制,开始请求就停止timer,http应答完毕就重新启动timer, 失败的情况就应该重新启动timer。
bloodish 2017-06-20
  • 打赏
  • 举报
回复
再放些代码上来,好做分析
浪子-无悔 2017-06-20
  • 打赏
  • 举报
回复
应该还是资源占有问题。。。
xuzuning 2017-06-20
  • 打赏
  • 举报
回复
有资源未释放 你是定时 http 请求,检查一下获取失败时的处理
  • 打赏
  • 举报
回复
引用 3 楼 bloodish 的回复:
再放些代码上来,好做分析
也就是说,第一次请求如果得不到及时响应,timer下一次请求又来了,就会有许多请求阻塞在那里,会导致资源未释放?是这个意思嘛
  • 打赏
  • 举报
回复
引用 1 楼 xuzuning 的回复:
有资源未释放 你是定时 http 请求,检查一下获取失败时的处理
引用 3 楼 bloodish 的回复:
再放些代码上来,好做分析
恩恩,你们说的貌似都指向了一个问题,很有可能,我试试,3Q
  • 打赏
  • 举报
回复
引用 1 楼 xuzuning 的回复:
有资源未释放 你是定时 http 请求,检查一下获取失败时的处理
有道理,我试试

110,537

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧