c#线程阻塞或假死,求助

qq_31382269 2017-11-06 02:23:26
程序包含3个窗体,分别为F1,F2,F3(均在公共类中实例化),主程序运行时在program里面执行Application.Run(F1)后,出现F1窗体,点击按钮打开F2窗体,在F2里打开F3窗体。
运行一段时间后3个窗体出现假死情况,查资料后得知原来我点击按钮后仅执行 窗体名.show(),而3个窗体都是在UI线程上执行,于是我在F1里将按钮事件改为Application.Run(F2),然后在F2按钮事件同样方法改为Application.Run(F3),然后发现运行一段时间后F1和F2窗体均流畅,但F3窗体依然假死。
进一步发现因为F3中有定时器timer,当不执行定时器里面的代码时,F3运行很流畅,开始执行后,就慢慢的变得很不流畅。我的定时器一开始是FORM中的timer,后来改为THREAD类型的timer后,F3窗体反应依然迟钝。
于是我再改,在THREAD类型的timer中新开一个线程a,把要执行的代码放在新的函数B里,用a去调用B,本想着这样F3就应该不会阻塞了吧,可是没有效果。
不知是何原因。下面我贴出F3的代码。求教各位好心人!!

F3窗体代码
public System.Threading timer;//定义定时器
private void Botton1_Click(object sender, EventArgs e)//按钮事件启动定时器
{
timer = new System.Threading.Timer(
new System.Threading.TimerCallback(ha), null,
2000, 5000);
}
private void ha(Object a)//定时器内容
{
Thread a = new Thread(B);//新线程
a.Start();

}
private void B()
{
//要循环执行的代码
}
...全文
1125 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
好大一地嗯 2017-11-07
  • 打赏
  • 举报
回复
设置线程后台执行 a.backgroud=true 另外在子线程时,加入sleep,否则CPU会一直抢占。
xuzuning 2017-11-06
  • 打赏
  • 举报
回复
F3窗体假死,是因为 F3 中有阻止事件响应的耗时操作,你只要在适当的时候交出控制权,让 F3 得以响应事件就可以了
exception92 2017-11-06
  • 打赏
  • 举报
回复
private void ha(Object a)//定时器内容 { Thread a = new Thread(B);//新线程 a.Start(); } -》这种写法应该杜绝!Thread的创建开销是比较大的,不要被线程这个名词误导,以为创建线程就能提高执行效率,滥用最浪费资源,反而倒是不用,甚至少用的效率要好。 定时器刚开始执行,进程中的线程比较少,但是时间一长,线程就会变多,它们不到迫不得已的时候不会销毁甚至需要手动的abort,这样导致线程越来越多,cpu利用率很高,其实cpu并没有做很多有意义的工作,而是执行的是你的B()方法中的代码。不确定你的B中执行的什么,但是把thread放到timer里执行是不可取的。
xdashewan 2017-11-06
  • 打赏
  • 举报
回复
ha这方法完全是多余的,Application.Run没有特殊需求也是没必要的,卡住的显然是【要循环执行的代码】,但你什么代码都没有贴。程序反应迟钝,也可能程序是CPU使用率非常高,或者操作ui不当

110,534

社区成员

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

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

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