application.doevents()

问题描述

do{if(num==7){return;}application.DoEvents();}while(num!=8);MessageBox.show("弹出提示");采取某些措施,执行几个循环后,先return,按道理说循环应该结束了,并且不弹出提示框。然后但是我再另外一个按钮事件中让num=8,提示框竟然弹出来了!求大神给出解释???????????????????????????

解决方案

解决方案二:
你那个按钮又将num设置为1了吧?
解决方案三:
你自己看看,怎么跳出循环?
解决方案四:
你现在的代码的使用的是do...while,当你另一个按钮赋值num=8的时候,逻辑是这样的:首先,num==7为false,所以不会return;其次,num==8,所以跳出do...while循环,执行后续的代码,即MessageBox.show("弹出提示");这个逻辑完全符合你现在的结果,即你通过另外一个按钮给num赋值8时,弹出提示框。
解决方案五:
另外,你在do循环里面,并没有改变num的值,所以如果没有通过其他的地方改变num的值,你的代码只有三种情况1)当NUM=7时,直接返回2)当NUM=8时,执行一次application.DoEvents();后马上弹出MessageBox.show("弹出提示");3)除上述两种情况外,永远循环。
解决方案六:
return不执行后面的代码了break是跳出循环
解决方案七:
直接给你一个忠告:不要使用Application.DoEvents。根据你的业务逻辑的不同,你可以使用NotifyPropertyChanged、Timer等等机制来反复完成一些操作,甚至(如果在毫秒内就能完毕的话)也可以使用子线程来循环处理。当然最可取的方式,就是把你认为的控制流程就是“一个大循环”这种程序设计习惯改掉。
解决方案八:
看看msdn的解释:如果您调用DoEvents在代码中,您的应用程序可以处理其他事件。其他事件就是你按钮点击事件,这么说你明白了吧
解决方案九:
这种程序应该这样设计(这里只是举例):首先为你的类型实现INotifyPropertyChanged接口(不管是你自己定义的数据实体,还是你从Form、Window、Page等等.net预定义的类扩展的子类),然后将你的num设计为属性(如果为字段,就重构为属性)。然后这个属性触发PropertyChanged事件。然后,对于调用你的上述类型的目标对象的客户程序,就可以通过注册监听Properyhanged事件,事件触发时再来判断if(num==8){....}

动不动就弄一个死循环去“监控”,你还要弄一堆诡异的东西去让界面不要卡死。实际上这种东西就算是你弄了一堆Application.DoEvents或者子线程之类的,用不了几个,你的进程也把人家的电脑给卡得快死机了。
解决方案十:
我多说两句。Application.DoEvents会打乱windows基础控件的消息泵的次序,让后边的一堆消息提前到当前代码的位置而爆发。想象一下你要捕获“鼠标移动过Panel1”和“鼠标移动过“Image1”以及"Timer1定时触发”事件。假设你是使用普通的事件处理过程,这里可能首先触发第一种事件10次,然后触发第二种事件3次,然后触发第三种事件1次,然后又触发第二种事件2次。但是,你会看到,在你的代码单线程处理完一个事件之后,才会去处理下一个事件。绝不可能有诡异的流程出现。使用Applicaiton.DoEvents,那么在代码处理一个事件过程中间,突然就把后边的事件给“冒出来”了,后边的一堆不可预知的(因为用户在移动鼠标)代码横插在你当前正在观察的任何代码的地方,胡乱跳转。你根本无法理解其流程。(而且Application.DoEvents实际上容易造成事件堆积、组合爆炸。这里就不多说了)Applcation.DoEvents是vb(vb1.1~vb6)的遗产,是用来移植那种根本没有多线程机制的vb代码的。在你的正式开发的.net程序中不要使用它。
解决方案十一:
引用7楼xdashewan的回复:

看看msdn的解释:如果您调用DoEvents在代码中,您的应用程序可以处理其他事件。其他事件就是你按钮点击事件,这么说你明白了吧

为什么我再按其它按钮时,必须按两次才生效,请指教??????????
解决方案十二:
引用10楼u011500419的回复:

为什么我再按其它按钮时,必须按两次才生效,请指教??????????

DoEvents后的事件处理很难表述,这就是用DoEvents的弊端
解决方案十三:
引用9楼sp1234的回复:

我多说两句。Application.DoEvents会打乱windows基础控件的消息泵的次序,让后边的一堆消息提前到当前代码的位置而爆发。想象一下你要捕获“鼠标移动过Panel1”和“鼠标移动过“Image1”以及"Timer1定时触发”事件。假设你是使用普通的事件处理过程,这里可能首先触发第一种事件10次,然后触发第二种事件3次,然后触发第三种事件1次,然后又触发第二种事件2次。但是,你会看到,在你的代码单线程处理完一个事件之后,才会去处理下一个事件。绝不可能有诡异的流程出现。使用Applicaiton.DoEvents,那么在代码处理一个事件过程中间,突然就把后边的事件给“冒出来”了,后边的一堆不可预知的(因为用户在移动鼠标)代码横插在你当前正在观察的任何代码的地方,胡乱跳转。你根本无法理解其流程。(而且Application.DoEvents实际上容易造成事件堆积、组合爆炸。这里就不多说了)Applcation.DoEvents是vb(vb1.1~vb6)的遗产,是用来移植那种根本没有多线程机制的vb代码的。在你的正式开发的.net程序中不要使用它。

感谢大神!!!!!!!!!!!!!!
解决方案十四:
引用8楼sp1234的回复:

这种程序应该这样设计(这里只是举例):首先为你的类型实现INotifyPropertyChanged接口(不管是你自己定义的数据实体,还是你从Form、Window、Page等等.net预定义的类扩展的子类),然后将你的num设计为属性(如果为字段,就重构为属性)。然后这个属性触发PropertyChanged事件。然后,对于调用你的上述类型的目标对象的客户程序,就可以通过注册监听Properyhanged事件,事件触发时再来判断if(num==8){....}

动不动就弄一个死循环去“监控”,你还要弄一堆诡异的东西去让界面不要卡死。实际上这种东西就算是你弄了一堆Application.DoEvents或者子线程之类的,用不了几个,你的进程也把人家的电脑给卡得快死机了。

大神:我的程序在一个窗体里面,里面有很多控件,我要在同一个命名空间中再创建一个类实现INotifyPropertyChanged接口吗?请再详细指教指教???????????????

时间: 2024-08-12 03:26:06

application.doevents()的相关文章

C#(asp.net) Application.DoEvents() 处理队列消息

该方法可以处理当前队列的消息,比如一个for循环 5000次 向TextBox中追加文本,那肯定会假死一会儿的. 此时便可使用Application.DoEvents()来处理队列的信息. 简单说下使用Application.DoEvents() 和 不使用Application.DoEvents() 的区别: 不使用Application.DoEvents(): 循环5000次的话,界面会假死一会儿,然后等待for循环完全结束后然后显示界面. 使用Application.DoEvents():

请问:C# web 有DoEvents 吗?

问题描述 在WINFROM中有Application.DoEvents();这个方法,是处理当前在消息队列中的所有Windows消息.我想在WEB服务里用这个方法,但是找不到,谢谢帮助! 解决方案 解决方案二:没有这东西的,winform和webform根本不是一样的东西解决方案三:那就无法实现类似的功能吗?解决方案四:一旦服务端返回内容给浏览器后,服务端就跟客户端没关系了,如果客户端要做什么事情,那就需要再发起请求,比如通过ajax或者直接post之类的,不懂你到底想干嘛解决方案五:要做一个摇

关于 DoEvents 的一些疑惑

问题描述 请问大家,我对DoEvents的表面理解就是,立即处理消息队列信息,放在While(true)里面,这样窗口就不会假死了,虽然可能效率会差点,我新开了一个收数据的线程,while(true)里面放这个有效果,但是为什么我在主线程里的while(true)里写还是会死,下面是程序,我一句一句删了,最后发现是加上读取数据的那个就会死:com.Read(StartRespond,0,1);用这个主要是想上下位机双方有个交互,不知道大家有没有什么更好的建议可以不用while(true)whil

VB.NET基础语法

很久以来,VB因为缺乏完善的面向对象支持.缺乏高效的错误处理机制和性能表现不佳,因而一直受到某些人的嘲笑.VB.NET将彻底改变这种情况.然而,VB.NET在这些方面的改进也要付出代价,许多旧的代码需要手工进行转换才能在VB.NET下运行. 下面几个表格总结了VB.NET语言在语法上的改动之处.注意这些表格并没有完全列出所有改动之处,但列出了最重要的一些改动. 表A对比了VB6中一些熟悉的语法形式及其在VB.NET中类似功能最接近的语法形式. 表A:语法对比旧语法 新语法 说明窗体装载事件,类初

如何用C#写代码批量下载网页上提供的附件。

问题描述 如何用C#写代码批量下载网页上提供的附件. 在一个网页上有一个导出PDF文件的功能,是当点击这个按钮后,执行一个脚本,然后弹出文件下载另存为的对话框进文件的下载功能. 现在希望用C#实现自动批量的下载并保存这些PDF文件. 求实现方法,谢谢! 解决方案 用webclient.downloadfile或者httpwebrequest去下载. 解决方案二: 建议压缩成ZIP包后再下载. 解决方案三: 执行的是一个脚本,现在我可以实现通过代码模拟这个单击操作,执行这个脚本,但是如何能得到下载

C#在状态栏中,自绘进度条,

别的都没什么好说的了,说说这个在状态栏中,画进度条的办法吧.偶是做网站的,一直很羡慕FTP软件中,地址栏中的进度条,那么酷....一直在猜想,人家是怎么把进度条控件..放到地址栏上的??????? - -!! 汗...前几天因为工作需要,用UTF格式来写WEB程序,还要成批处理.写了这软件.一时灵感,试了试居然成功的自绘了进度条. 下面是源码: (另:状态栏name: stat 三个item 分别是: stat_1 stat_2 stat_3 ,stat_3属性设置成自绘.***********

笨笨图片批量下载器 V0.3 beta[C# | WinForm | 正则表达式 | HttpWebRequest | Async异步编程] new

前言      从[笨笨图片批量抓取下载 V0.2 beta]到[笨笨图片批量下载器 V0.3 beta]时间将近2个月,不是说这个升级版本开发了这么久,实在是懒,呵呵: )再加有时候工作忙.学习,多的时间就不愿意动了,现在都感觉辜负了上一版N多朋友的支持了,不过这将近一个星期时间我按计划完成了这个小软件版的升级开发,并且依然和上两个版本一样保持源代码开源,文章最后有下载地址,以下是这个版本相比上个版本的特点:      1.     加入图片是否重命名.      2.     加入异步线程池

datagridview-vb.net DataGridView 动态逐个选择所有单元格

问题描述 vb.net DataGridView 动态逐个选择所有单元格 For i As Integer = 0 To DataGridView1.Rows.Count - 1 i += 1 DataGridView1.Rows(i).Cells((DataGridView1.CurrentCell.ColumnIndex)).Selected = True Next 这样不行,用TIMER控件可能行,但是俺不会弄,请高手指点! 解决方案 For i As Integer = 0 To Dat

用VB.NET轻松制作特效窗体

窗体是Windows应用程序的基础.新一代的开发工具Visual Basic.Net为设计制作窗体提供了更多简单而丰富的方法,无需再求助于复杂而易错的API函数,我们就可以轻松制作多种特效窗体: 1 .轻松制作透明窗体 VB.NET可以轻松制作出任一透明度的窗体:我们只要在窗体的"属性"窗口中,将 Opacity 属性设置为一个介于 0.0(完全透明)与 1.0(完全不透明)之间的值就可以了: Dim frm As FrmTrans = New FrmTrans() frm.Opaci