【求教】关于Application.DoEvent()

Haitani 2018-03-20 02:46:20
目标:让label从1到99999连续显示
winform,用for循环去给label赋值,用网上提供的方法Application.DoEvents(),可以消除卡死的现象,然后想问问,这个方法的优缺点是什么,和委托线程的方式比呢?如果正视的对待这个小功能,哪种方法才是最正宗的,还请大神们指点一下,谢谢
...全文
325 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuzuning 2018-03-21
  • 打赏
  • 举报
回复
相反,滥用多线程的程序才是坏程序
xuzuning 2018-03-21
  • 打赏
  • 举报
回复
需要单线程时就单线程 需要多线程时就多线程 不能强求 其实 winform 本身就是多线程的(事件处理都在子线程中完成),并不是说没有 Thread 字样就不是多线程的 谁也不能说,不使用多线程就不是好程序
Haitani 2018-03-21
  • 打赏
  • 举报
回复
引用 6 楼 xuzuning 的回复:
为什么要排斥 Application.DoEvents 呢? 比如有这样一个应用:点击按钮后,开始一个排序或汉诺塔的计算,期间需要将每一步的中间结果用图形绘制在 PictureBox 中 显然在循环或递归中使用 Application.DoEvents 让 PictureBox 去响应 Paint 事件是最简捷的方式 当然你可以在按钮点击事件中,启动一个定时器,由定时器去执行计算程序。但是如何让程序单步运行呢? 虽然控制算法并不太难,但保护和恢复现场的代码,势必会影响到业务算法的可读性
首先感谢各位前辈版主的支持和回答,对于如题,如果说Application.DoEvent就能解决问题当然是好,因为确实简单有效就能直接解决我的小例子,其实我主要想以此引申一下,如果有更安全可靠的技术可用,我觉得完全有必要重新学习,就像sp1234前辈,我的一个小小的问题,他给我带来的知识量和潜在问题分析,以及对程序宏观的设计的思想真的是非常丰富,虽然我很多东西还要再理解。我并不想在网上搜索个代码复制能运行就完事,也不想直接百度百科背概念,而是想听听各位对技术问题亲身经历和理解
  • 打赏
  • 举报
回复
如果不存在任何问题,干嘛不用 Application.DoEvents,简单化处理方式,不要为了折腾而折腾
xuzuning 2018-03-21
  • 打赏
  • 举报
回复
为什么要排斥 Application.DoEvents 呢? 比如有这样一个应用:点击按钮后,开始一个排序或汉诺塔的计算,期间需要将每一步的中间结果用图形绘制在 PictureBox 中 显然在循环或递归中使用 Application.DoEvents 让 PictureBox 去响应 Paint 事件是最简捷的方式 当然你可以在按钮点击事件中,启动一个定时器,由定时器去执行计算程序。但是如何让程序单步运行呢? 虽然控制算法并不太难,但保护和恢复现场的代码,势必会影响到业务算法的可读性
  • 打赏
  • 举报
回复
这是调试大规模的交互程序时的团队设计经验。
Haitani 2018-03-21
  • 打赏
  • 举报
回复
引用 3 楼 sp1234 的回复:
具体你的例子,你在窗体中“用for循环去给label赋值”是要干什么?你为什么不直接给 Label.Text 直接赋值为最后一个值? 还不是为了让界面上定时跳动显示嘛!这就应该有定时 UI 交互概念。而根本不是什么 for 循环编程概念。
是这样的前辈,有时为了验证一些想法,我会做一些没有太多实际背景意义的小程序,只是就事论事的去完成功能,以便在实际应用时能提供思路之类的,可能这种方式有偏差吧,如果真是如题的,比如做个label当前时间的显示,你说的定时UI交互,要用到什么具体技术,还是说我用timer控件定时的更新UI就算是定时UI交互了?谢谢
  • 打赏
  • 举报
回复
比如说你在事件 A 的处理过程中有 Application.DoEvents,然后大乱的事件处理次序中陷落的事件处理过程 B 中也有 Application.DoEvents,如此类推,不出几步,你的程序就无法在运行时调试了,因为代码执行乱“跳”,根本不是按照正常的事件发生次序来触发事件处理过程的。 在vb5、vb6 这种 STAThread 程序中写 Application.DoEvents,在 .net 最初也保留了 vb 功能。但是在 .net 中应该尽量避免。当你写几行 demo 语句的时候可以用它,开发大一点的实际系统时应该避免使用它。 实际上,你应该避免写 while 死循环,应该学习事件驱动的开发方法,用事件回调来编排程序交互次序。而不是写什么 while 循环。
  • 打赏
  • 举报
回复
具体你的例子,你在窗体中“用for循环去给label赋值”是要干什么?你为什么不直接给 Label.Text 直接赋值为最后一个值? 还不是为了让界面上定时跳动显示嘛!这就应该有定时 UI 交互概念。而根本不是什么 for 循环编程概念。
  • 打赏
  • 举报
回复
Application.DoEvents 是以前 vb 中的做法,不是 .net 中的做法。 vb 是单线程的,没有多线程的技术。Application.DoEvents 就是打乱 windows消息泵次序,让当前的windows消息处理过程中来提前执行后边的 windows消息处理,类似于递归。这在 vb STAThread 这类模式中,没有什么多线程概念,所以这个方法比较多人知道。 假设你在鼠标 moveover 事件中执行 Applicaton.doevents,你实际上在这个事件还没有处理完之前就造成了另外一大堆原本排在后续的事件处理程序被提前执行,实际上不断会造成你调试混乱,而且很容易造成事件触发死循环(当你有自动事件的时候)。 所以其实不论是 STAThread 还是多线程编程,其实更加根本的,是不要胡乱写
while(true)
{
     .......
}
这种死循环逻辑,而应该事件驱动、异步处理。否则写出的程序一开始很小只有几行的时候还觉得“可以”,些稍微大一些的系统就乱了。 并且那些没有调试、测试习惯的人因为是全凭猜测来编程开发,而不是专业开发,所以他们很难理解这类代码给调试开发带来的问题。

110,536

社区成员

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

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

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