`
king_c
  • 浏览: 223855 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Application.DoEvents();

    博客分类:
  • c#
 
阅读更多
写道
http://www.cnblogs.com/datong/archive/2008/04/06/1139216.html

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

for (int q = 0; q < 1000000; q++)
            
{
                textBox1.Text 
= q.ToString();
                Application.DoEvents();//实时响应文本框中的值
            }

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

        private void button1_Click(object sender, EventArgs e)
        
{
            expendTime.start();
            
for (int q = 0; q < 100000; q++)
            
{
                textBox1.Text 
= q.ToString();
                Application.DoEvents();
            }

            label2.Text 
= expendTime.ComputerTime();//计算耗时
        }


        
private void button2_Click(object sender, EventArgs e)
        
{
            expendTime.start();
            
for (int q = 0; q < 100000; q++)
            
{
                textBox2.Text 
= q.ToString();
            }

            label3.Text 
= expendTime.ComputerTime();//计算耗时
        }


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

分享到:
评论

相关推荐

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

    在C#编程中,`Application.DoEvents()` 是一个经常被讨论的话题,特别是在处理用户界面(UI)更新和异步操作时。这个方法允许应用程序在执行长时间运行的任务时处理挂起的Windows消息,从而防止界面假死(也称为无...

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

    但是,加入`Application.DoEvents()`后,每执行一次`DoEvents()`,UI线程就会检查并处理一次消息队列,使得`label1`的文本能够随着循环的进行而动态更新。 尽管`Application.DoEvents()`在某些场景下可以解决问题,...

    防止程序假死

    本文档旨在探讨导致程序假死的原因及解决方案,特别是如何合理使用`Application.DoEvents()`方法来改善用户体验。 #### 二、程序假死现象分析 程序假死主要发生在以下几种情况: 1. **长时间的计算过程**:当程序...

    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更新

    9. **理解ANR(Application Not Responding)**:当主线程阻塞超过5秒,系统会弹出ANR对话框,提示用户应用无响应。合理使用线程能有效避免这种情况。 10. **设计模式与最佳实践**: - 使用Handler+Runnable或...

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

    在C#编程中,我们经常使用MessageBox来显示警告或提示信息。...本文将介绍一种方法,通过结合定时器(Timer)和SendKeys类,实现延时并自动关闭MessageBox的功能。 首先,我们需要创建一个Timer数组,用于存放多个计时...

    vb.net延迟方法 占用少量CPU 效果可以

    该方法利用Windows API中的`timeGetTime`和`Sleep`函数,并结合循环和`Application.DoEvents()`确保在延时期间既不会导致界面冻结也不会过度占用CPU资源。对于那些需要简单、低资源消耗的延时功能的应用程序来说,这...

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

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

    Winform窗体淡入淡出效果

    2. **延时与事件处理**:为了确保每次透明度变化都能被用户感知,使用了`Thread.Sleep(1)`进行微小延时,并通过`Application.DoEvents()`确保界面更新。 #### 方法二:使用定时器`Timer` 利用定时器可以更方便地...

    渐隐渐现的透明窗体C#代码实现源代码学习用

    需要注意的是,由于.NET的UI更新机制,我们需要使用Application.DoEvents()确保在每一步透明度变化后更新界面。Thread.Sleep()函数用来控制动画的节奏,数值越小,动画速度越快。 另外,对于窗体上的控件,它们也会...

    VB.Net 控制 QQ发送信息

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

    加载画面窗体

    在`loadingForm.Show()`后执行耗时操作,`Application.DoEvents()`确保在处理这些操作期间,UI仍能响应用户输入并更新加载画面。请注意,这种方法并不适合长时间的后台操作,因为它可能会导致UI线程阻塞,建议使用多...

    广联达delphi笔试题

    - 在 Delphi 中,当需要应用程序在处理其他任务的同时也能响应用户操作时,使用 `Application.DoEvents` 可以确保应用程序保持响应状态。 #### 题目三:ListBox 和 ComboBox 更新技巧 1. **问题:**在 Delphi 中...

    c#winform进度条

    `Application.DoEvents()`调用确保在处理循环期间,UI可以及时响应,更新进度条的显示。 此外,`Step`属性可以用来指定每次递增的值,这在处理固定步长的进度时很有用。例如,如果每个步骤是2%,我们可以这样设置:...

    根据文件大小显示复制进度条

    `Progress.Value`的更新和`Application.DoEvents()`的调用确保了进度条随着文件复制的进程而实时更新。 为了进一步提高用户体验,还可以添加错误处理机制,比如使用`try-catch`块捕获可能出现的异常,并在复制失败...

    c#实现文件读写并显示读写进度

    需要注意的是,`Application.DoEvents()`函数被用来处理窗体事件,使得进度条能够在写入过程中实时更新。在实际项目中,可能需要更复杂的多线程或异步处理来避免阻塞UI。 在开发过程中,为了确保程序的健壮性,还...

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

    根据文章提供的信息,我们可以推断出之所以会出现CPU占用率100%的情况,是因为在游戏主循环中不断地调用`gameEngine.Update()`和`Application.DoEvents()`。这两个方法会在短时间内被频繁地调用,没有给操作系统留出...

    VB.NET渐隐关闭窗口的实现方法

    4. **刷新窗体**:每次更改透明度后调用 `Application.DoEvents()` 和 `Me.Refresh()` 来刷新界面,确保变化即时反映到界面上。 #### 三、具体实现步骤及代码示例 以下是一个具体的实现示例,该示例展示了如何在 ...

    2013伪Q登陆界面源代码

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

Global site tag (gtag.js) - Google Analytics