C#怎么减少假死,等待响应时间?

bestlygg 2014-09-13 11:09:58
A类中调用a方法,a方法中有对控件的操作有需要等待的事件,每当调用a方法时就假死了,怎么减少这种假死的时间?我用线程去操作需要等待的事件,结果不是创建线程不能对他进行操作,a方法使用也比较频繁。
...全文
624 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
tanta 2014-09-15
  • 打赏
  • 举报
回复
引用 3 楼 sp1234 的回复:
“a方法中有对控件的操作有需要等待的事件”这个概念就不对,程序设计中就不存在这种“等待事件”。 当你的程序注册了一个事件回调,你的程序就“结束了”。这种所谓的“等待”是一个口头说法,在程序流程图上没有任何对应的东西。当事件回调处理方法被执行,一个新的流程开始了。它们根本不是“在一个a方法中”的。 找个真正的老师学一下程序设计时如何画流程图的问题,特别是学习一下流程中间有用户交互操作时的流程图设计,做到流程图和代码能够保持一致。不要找那些只会念书的老师。
是啊
卧_槽 2014-09-15
  • 打赏
  • 举报
回复
归根结底一句话,无聊的工作不要让UI线程去干。
shiyuxuexi 2014-09-15
  • 打赏
  • 举报
回复
采用多线程可以有效解决此类问题
applemeteor 2014-09-15
  • 打赏
  • 举报
回复
控件的操作是UI线程,后台数据量大,为了防止在UI线程操作导致假死的情况才用多线程 一般是 多线程处理数据完毕之后,结果可保存到一些变量中,再才对UI线程进行赋值、布局等操作,这些赋值操作是很快的,不会导致假死。而后台另外一个线程在处理数据,也不会影响到UI线程,也就不会卡死
Delta 2014-09-15
  • 打赏
  • 举报
回复
引用 10 楼 phommy 的回复:
用await和async 参考 http://www.cnblogs.com/LoveJenny/archive/2011/11/01/2230933.html
还有一个控件:backgroundworker,我经常使用这个来处理等待时间。
nongfuxu 2014-09-15
  • 打赏
  • 举报
回复
引用
找个真正的老师学一下程序设计时如何画流程图的问题,特别是学习一下流程中间有用户交互操作时的流程图设计,做到流程图和代码能够保持一致。不要找那些只会念书的老师。
引用
什么“线程、循环、阻塞、等待”之类的,都是坑爹。先把“事件驱动程序”的模式搞明白,写出来的程序或者画出来的流程图,才不会想当然地出现什么“死等”的逻辑活动。
学习。
phommy 2014-09-15
  • 打赏
  • 举报
回复
用await和async 参考 http://www.cnblogs.com/LoveJenny/archive/2011/11/01/2230933.html
bestlygg 2014-09-15
  • 打赏
  • 举报
回复
引用 3 楼 sp1234 的回复:
“a方法中有对控件的操作有需要等待的事件”这个概念就不对,程序设计中就不存在这种“等待事件”。 当你的程序注册了一个事件回调,你的程序就“结束了”。这种所谓的“等待”是一个口头说法,在程序流程图上没有任何对应的东西。当事件回调处理方法被执行,一个新的流程开始了。它们根本不是“在一个a方法中”的。
但是a方法没有执行完,也调用不了a方法,必须等a方法执行完了,才能进行操作了啊
PaulyJiang 2014-09-15
  • 打赏
  • 举报
回复
用多线程去通知执行操作
effun 2014-09-15
  • 打赏
  • 举报
回复
最简单的办法就是用BackgroundWorker去执行耗时的操作,然后在界面上做相应的控制就可以了。
我叫小菜菜 2014-09-15
  • 打赏
  • 举报
回复
引用 9 楼 liuyi1398214531 的回复:
[quote=引用 3 楼 sp1234 的回复:] “a方法中有对控件的操作有需要等待的事件”这个概念就不对,程序设计中就不存在这种“等待事件”。 当你的程序注册了一个事件回调,你的程序就“结束了”。这种所谓的“等待”是一个口头说法,在程序流程图上没有任何对应的东西。当事件回调处理方法被执行,一个新的流程开始了。它们根本不是“在一个a方法中”的。
但是a方法没有执行完,也调用不了a方法,必须等a方法执行完了,才能进行操作了啊[/quote] 如果a方法执行时间太长无法忍受,就只能把它扔到一个新线程中执行或者在a方法中对耗费时间的地方使用子线程。但使用了子线程,就必须考虑到a方法中所做的某些修改造成的影响并解决。如果a方法有返回值,那后面要使用这个返回值的话,只能等待a函数结束并返回了。
finemi 2014-09-14
  • 打赏
  • 举报
回复
跨线程操作窗体的方法: 1、设置Control.CheckForIllegalCrossThreadCalls = false; 2、使用委托 当然还有其他方法 你可以百度搜一下 C#跨线程操作控件
  • 打赏
  • 举报
回复
什么“线程、循环、阻塞、等待”之类的,都是坑爹。先把“事件驱动程序”的模式搞明白,写出来的程序或者画出来的流程图,才不会想当然地出现什么“死等”的逻辑活动。
  • 打赏
  • 举报
回复
“a方法中有对控件的操作有需要等待的事件”这个概念就不对,程序设计中就不存在这种“等待事件”。 当你的程序注册了一个事件回调,你的程序就“结束了”。这种所谓的“等待”是一个口头说法,在程序流程图上没有任何对应的东西。当事件回调处理方法被执行,一个新的流程开始了。它们根本不是“在一个a方法中”的。 找个真正的老师学一下程序设计时如何画流程图的问题,特别是学习一下流程中间有用户交互操作时的流程图设计,做到流程图和代码能够保持一致。不要找那些只会念书的老师。
newxdlysk 2014-09-13
  • 打赏
  • 举报
回复
参考这个帖子http://bbs.csdn.net/topics/390877297
allen0118 2014-09-13
  • 打赏
  • 举报
回复
使用多线程可防止假死状态。
漫天雪飞 2014-09-13
  • 打赏
  • 举报
回复
多线程
mrpmc 2014-09-13
  • 打赏
  • 举报
回复
使用多线程可以防止假死
  • 打赏
  • 举报
回复
如果是2.0的就得使用多线程。 如果是3.5以上,可以用异步来操作UI。
呵呵,关键自己程序里要用到 所以开发了这个小功能 很多地方很粗糙,俺菜鸟,高手们就别贬我了。 使用的时候把2个dll放到你的程序目录,在资源管理器引用LOADing.dll 就可以了,DevComponents.DotNetBar2.dll为确定按钮控件的引用 列子: private void dl_Click(object sender, EventArgs e) { LOADing.FORMshow load = new LOADing.FORMshow(); load.showto(this, delegate { hand(new object[] { load, "正在处理数据" }); },false); } private void hand(object fr) { int i = 0; while (i < 100) { i++; ((LOADing.FORMshow)((object[])(fr))[0]).send((string)((object[])(fr))[0]+i.ToString()); System.Threading.Thread.Sleep(100); } } 主要用于处理数据的时候,提示用户处理过程,防止界面假死,数据处理完毕后会自动关闭窗体。 注:this为所要调用等待窗体的主窗体对象,中间为数据传递的委托,显示数据处理的过程.load.showto(this, delegate { hand(new object[] { load, "正在处理数据" }); });中new object[] 第一个参数一定要为固定的参数:创建LOADing.FORMshow的实例,后面再就可跟任意数据,都可在方法的过程中调用显示,最后的bool参数:false方法函数执行完毕后自动关闭窗体显示;true为方法执行完毕后出现确定按钮并阻塞主线程UI,点击确定后关闭提示窗体并取消阻塞线程,这么简单,用相信大家都会用了。 界面没有进行美化,感觉这样的就可以了,随后会升级为可自定义界面! 有问题加我QQ76230454

110,533

社区成员

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

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

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