问题描述
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接口吗?请再详细指教指教???????????????