`

关于Application.DoEvents()

    博客分类:
  • C#
 
阅读更多

记得第一次使用Application.DoEvents()是为了在加载大量数据时能够有一个数据加载的提示,不至于系统出现假死的现象,当时也没有深入的去研究他的原理是怎样的,结果在很多地方都用上了Application.DoEvents(),今天看到了关于这方面的一些文章,知道我以前有些用法是不当的,有些地方需要慎用Application.DoEvents()。
首先我们先看看在循环比较大的程序中,它的作用还是不错的,起到了一个实时响应的效果,例如:

如果没有加上 DoEvents的话,由于循环时间会比较久就会出现假死的状态,而且程序不能处理其他的事件。而如果加上DoEvents的话就会对文本框的值实时响应,给用户带来较好的用户体验,可是DoEvents也带来了效率上的问题,处理同样的一个事件调用了DoEvents后效率降低了好几倍,这也是为什么要慎用的原因了。下面是我做的一个测试:


执行耗时对比:
从较大数据的循环中可以看出效率是很低的,所以如果能不调用DoEvents就尽量不用。也可以通过别的方法来处理的,例如多线程异步调用等。
MSDN中的定义:
当运行 Windows 窗体时,它将创建新窗体,然后该窗体等待处理事件。该窗体在每次处理事件时,均将处理与该事件关联的所有代码。所有其他事件在队列中等待。在代码处理事件时,应用程序并不响应。例如,当将另一窗口拖到该窗口前面时,该窗口不重新绘制。如果在代码中调用 DoEvents,则您的应用程序可以处理其他事件。例如,如果您有向 ListBox 添加数据的窗体,并将 DoEvents 添加到代码中,那么当将另一窗口拖到您的窗体上时,该窗体将重新绘制。如果从代码中移除 DoEvents,那么在按钮的单击事件处理程序执行结束以前,您的窗体不会重新绘制。
通常,您在循环中使用该方法来处理消息。

分享到:
评论

相关推荐

    C# Application.DoEvents() 防界面假死例子。

    请自行测试有Application.DoEvents() 和没有Application.DoEvents()的区别,即可。 有疑问可发送Email给我: Andrew.Wangxu@gmail.com

    C# WinForm程序处理后台繁忙导致前台控件假死现象解决方法

    主要介绍了C# WinForm程序处理后台繁忙导致前台控件假死现象解决方法,本文通过Application.DoEvents()解决这个问题,并讲解了Application.DoEvents()的作用,需要的朋友可以参考下

    C#实现窗体淡入淡出效果的方法总结

    1. 代码如下: private void Form1_Load(object sender, System.EventArgs e) ... Application.DoEvents(); this.Opacity=d; this.Refresh(); }2. 代码如下: private void timer1_Tick(object sender, 

    [毕设季 android开发]第六讲:Android线程及UI更新

    讲解Android线程和UI更新,通过handler进行主线程UI的更新。

    C#实现延时并自动关闭MessageBox的方法

    主要介绍了C#实现延时并自动关闭MessageBox的方法,非常实用的功能,需要的朋友可以参考下

    Wince c#程序高效而且省电的思路【抛砖引玉】

    提供一个高效的方法来处理需要实效很高的地方 在游戏开发的过程中我们一般会有一个游戏引擎:gameEngine,为了让程序响应... Application.DoEvents(); } 可以看到。这时候系统的cpu占用率是100%。因为内部是这样作的。

    ekho包含多个语音报,调用看描述

    Application.DoEvents(); //SpeechSynthesizer synth = new SpeechSynthesizer(); //synth.SelectVoice("Microsoft Simplified Chinese"); Type type = Type.GetTypeFromProgID("SAPI.SpVoice"); dynamic ...

    VB.Net 控制 QQ发送信息

    刚研究VB控制QQ发送信息,网上找了点资料 在VS2010中的VB中测试了一下,能够发信息,目前只研究到这种程序 ... My.Application.DoEvents() Loop Until tick + HowLong < My.Computer.Clock.TickCount End Sub

    2013伪Q登陆界面源代码

    System.Windows.Forms.Application.DoEvents(); } } public login() { InitializeComponent(); // System.Threading.Thread.Sleep(2000); // this.label1.Text = "正在登陆 (" + Form1.parame + ")."; // ...

    C#打印,以及打印之前测试打印机是否已准备好.

    Application.DoEvents();//Processes all Windows messages currently in the message queue if (aa == "Idle") { this.printDocument1.Print(); } else { MessageBox.Show("Please check whether your ...

    C#多线程解决界面卡死问题的完美解决方案

    C#多线程解决界面卡死问题的完美解决方案

    延时函数vbnet

    vbnet写的延时函数 Sub DelayTime(ByVal tms毫秒 As Integer) Dim st As Long = Now.Ticks ... Application.DoEvents() st1 = Now.Ticks Case Else '达到条件下,延时结束 Exit Do End Select Loop End Sub

    模拟浏览器抓取网页内容(审查元素中内容)

    利用HtmlAgilityPack可以轻松获取网页内容,但是无法获取动态加载的内容, 通过webBrowser模拟浏览器,获取网页内容。...(配合使用webBrowser_DocumentCompleted和Application.DoEvents()) 3、解析网页内容

    excel定时定时执行

    是EXCEL的定时执行 Sub OntimeRun() '运行前用k先判断是否运行 ... Application.OnTime Now() + TimeValue("00:00:03"), "OntimeRun" End If '释放控制权,让excel可以干其他事情 VBA.DoEvents End Sub

    QQ vba 登 录

    With CreateObject("InternetExplorer.application") .Visible = True .Navigate "http://qzone.qq.com/" Do Until .readystate = 4 DoEvents Loop .document.getelementbyid("u").Value = ...

    VBA实现进度条的显示

    Application.ScreenUpdating = False Counter = 1 RowMax = 100 ColMax = 25 For r = 1 To RowMax For c = 1 To ColMax Cells(r, c) = Int(Rnd * 1000) Counter = Counter + 1 Next c Completed = Counter...

    WPFC#.net 跨线程更新UI 线程测试 解决界面卡死

    Demo测试跨线更新UI 第一种 : Thread 达到跨线程更新UI 虽然使用Dispatcher.Invoke 和模拟winform 里面的DoEvent 但是运行中关闭还是会有异常,而且耗资源高; 第二种 : DispatcherTimer 失败:UI还是会卡顿;...

    网页页面图片批量下载

    Application.DoEvents(); #endregion //分析完毕 isAnalyzeComplete = true; } } 这两个方法主要是用WebClient来请求然后异步获得网址所返回的数据并对数据分析,提取图片链接,提取主要有两种方式:一种...

    VB编程资源大全(英文源码 网络)

    <END><br>12 , telnet.zip Telnet Application<END><br>13 , validip.zip Validate an IP address 14 , dmvbtest.zip This is a complete email sending client in Visual Basic<END><br>15 , ...

Global site tag (gtag.js) - Google Analytics