System.Windows.Forms.Application.DoEvents();

froor 2010-10-23 05:23:50
C#语句。。。。这句话怎么理解,有什么用???
...全文
1299 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
足球中国 2010-10-23
  • 打赏
  • 举报
回复
DoEvents
My.Application.DoEvents 方法允许应用程序处理代码运行时可能引发的其他事件。My.Application.DoEvents 方法的行为与 DoEvents 方法的相同。

当您运行 Windows 窗体应用程序时,它将创建一个新窗体,该窗体等待要处理的事件。该窗体每次处理某个事件(如单击按钮)时,会处理与该事件关联的所有代码。所有其他事件将在队列中等待。当代码处理事件时,应用程序不会响应。例如,如果将甲窗口拖到乙窗口之上,则乙窗口不会重新绘制。

如果在代码中调用 My.Application.DoEvents,应用程序将可处理其他事件。例如,如果代码在一个循环中将数据添加到 ListBox,并且在该循环的每一步之后调用 My.Application.DoEvents,则当其他窗口被拖到您的窗体之上时,该窗体将重新绘制。如果从代码中移除 My.Application.DoEvents,则在按钮的单击事件处理程序执行完毕前,您的窗体不会重新绘制。

通常,您在循环中使用此方法来处理消息

其实就是把权利马上还给系统。让系统继续去做别的事情。
足球中国 2010-10-23
  • 打赏
  • 举报
回复
DoEvents
My.Application.DoEvents 方法允许应用程序处理代码运行时可能引发的其他事件。My.Application.DoEvents 方法的行为与 DoEvents 方法的相同。

当您运行 Windows 窗体应用程序时,它将创建一个新窗体,该窗体等待要处理的事件。该窗体每次处理某个事件(如单击按钮)时,会处理与该事件关联的所有代码。所有其他事件将在队列中等待。当代码处理事件时,应用程序不会响应。例如,如果将甲窗口拖到乙窗口之上,则乙窗口不会重新绘制。

如果在代码中调用 My.Application.DoEvents,应用程序将可处理其他事件。例如,如果代码在一个循环中将数据添加到 ListBox,并且在该循环的每一步之后调用 My.Application.DoEvents,则当其他窗口被拖到您的窗体之上时,该窗体将重新绘制。如果从代码中移除 My.Application.DoEvents,则在按钮的单击事件处理程序执行完毕前,您的窗体不会重新绘制。

通常,您在循环中使用此方法来处理消息

其实就是把权利马上还给系统。让系统继续去做别的事情。
threenewbee 2010-10-23
  • 打赏
  • 举报
回复
sp1234的说法如果没有看懂,我说一个浅显的。

在界面上放一个Label,一个Button。
编写如下代码:

Button_Click()
{
int k = 0;
for (int i = 0; i <= 999; i++, k = 0)
{
Label1.Text = i.ToString();
Application.DoEvents();
for (int j = 0; j <= 9999999; j++) k++; // 依照计算机性能不同,循环次数可以变化。
}
}

运行程序,单击按钮,Label的数字在增加。
这时候,如果再按一次,Label的数字会怎样呢?

它会再次从0开始,增加到999,之后再继续从前一个按钮处理事件中断的数字开始增加。

这明显说明,它和多线程一点没有关系。只是在遇到DoEvents()调用处理队列里面的消息,引发Button_Click,这次调用的Button_Click,相当于前一次的子程序。

假设在 i = 506 的时候,你按动了Button,那么执行的代码等效:

Button_Click()
{
int k = 0;
for (int i = 0; i <= 999; i++, k = 0)
{
Label1.Text = i.ToString();
if (i == 506) Button_Click();
for (int j = 0; j <= 9999999; j++) k++; // 依照计算机性能不同,循环次数可以变化。
}
}
  • 打赏
  • 举报
回复
关于消息机制,可以google:http://www.google.com.hk/search?q=windows%E6%B6%88%E6%81%AF%E5%BE%AA%E7%8E%AF&rls=com.microsoft:zh-cn:IE-SearchBox&ie=UTF-8&oe=UTF-8&sourceid=ie7&hl=zh-CN

DoEvent就是在程序中递归调用一次消息处理程序,让处理程序处理下一条消息,然后返回来继续执行当前的代码。这并不会让程序多线程执行,要注意别把多线程的说法往这个递归调用消息处理程序上面硬套。

或许现在学软件专业的学生在学《操作系统》课程是还是只能学点unix系统的皮毛,而连windows消息系统一丁点稍微底层的源代码都没有接触过。如果学过,我们招聘到的专业软件开发人员时或许可以招聘到几个比较容易理解windows系统基础的人。
skyering 2010-10-23
  • 打赏
  • 举报
回复
个人理解:Application.DoEvent()

举个例子如下:
有个查询按钮,其检索过程很耗时。所有需求是当点击查询按钮时,将其文本内容改为正在检索中...。并且将其Enable设为false。

this.btnSearch.Text = "正在检索中...";
this.btnEnable = false;
...
...
...

如果向上面那么写,那么点击查询按钮之后,并不能立即看到按钮样式和文本的改变。将其改为如下写法之后

this.btnSearch.Text = "正在检索中...";
this.btnEnable = false;
Application.DoEvent()

...
...
...
Application.DoEvent()意思就是使
this.btnSearch.Text = "正在检索中...";
this.btnEnable = false;两句代码的效果立即显示出来。并不会等到政策检索方法结束之后才看到效果(基本看不到效果)。
wuyq11 2010-10-23
  • 打赏
  • 举报
回复
Application.DoEvents()是为了在加载大量数据时能够有一个数据加载的提示,不至于系统出现假死的现象
可确保辅助线程激发的任何事件都由该 UI 线程处理

111,129

社区成员

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

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

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