begininvoke和endinvoke(C#为什么要使用Invoke,它和BeginInvoke有什么区别)

2025-07-29 15:00:01 0

begininvoke和endinvoke(C#为什么要使用Invoke,它和BeginInvoke有什么区别)

今天给各位分享C#为什么要使用Invoke,它和BeginInvoke有什么区别的知识,其中也会对C#为什么要使用Invoke,它和BeginInvoke有什么区别进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录

C#为什么要使用Invoke,它和BeginInvoke有什么区别

在Invoke或者BeginInvoke的使用中无一例外地使用了委托Delegate。
一、为什么Control类提供了Invoke和BeginInvoke机制?
关于这个问题的最主要的原因已经是dotnet程序员众所周知的,我在此费点笔墨再次记录到自己的日志,以便日后提醒一下自己。
1、windows程序消息机制
Windows GUI程序是基于消息机制的,有个主线程维护着一个消息泵。这个消息泵让windows程序生生不息。
Windows GUI程序的消息循环
Windows程序有个消息队列,窗体上的所有消息是这个队列里面消息的最主要来源。这里的while循环使用了GetMessage()这个方法,这是个阻塞方法,也就是队列为空时方法就会被阻塞,从而这个while循环停止运动,这避免了一个程序把cpu无缘无故地耗尽,让其它程序难以得到响应。当然在某些需要cpu最大限度运动的程序里面就可以使用另外的方法,例如某些3d游戏或者及时战略游戏中,一般会使用PeekMessage()这个方法,它不会被windows阻塞,从而保证整个游戏的流畅和比较高的帧速。
这个主线程维护着整个窗体以及上面的子控件。当它得到一个消息,就会调用DispatchMessage方法派遣消息,这会引起对窗体上的窗口过程的调用。窗口过程里面当然是程序员提供的窗体数据更新代码和其它代码。

Invoke和BeginInvoke的区别

查看MSDN如下:
Control..::.Invoke ---》 在拥有此控件的基础窗口句柄的线程上执行委托。
Control..::.BeginInvoke ---》 在创建控件的基础句柄所在线程上异步执行委托。
显然,Invoke() 与 BeginInvoke() 方法间的主要区别在于“异步”关键字眼。
也就是说,
Invoke() 调用时,会阻塞当前线程,等到 Invoke() 方法返回才继续执行后面的代码,表现出“同步”的概念。
BeginInvoke() 调用时,当前线程会启用线程池中的某个线程来执行此方法,当前线程不被阻塞,继续运行后面的代码,表现出“异步”的概念。
EndInvoke() ,在想获取 BeginInvoke() 执行完毕后的结果时,调用此方法来获取。
控件为何会需要Invoke()或BeginInvoke()方法呢?
因为控件的这样一个特点:控件的数据(或状态)值只能在创建控件的那个线程上被更改。也就是说如果控件是在线程A上创建的,则其它任何线程B都不允许修改控件的值,只可以访问(读取)。控件的值只能在线程A上进行更改。
基于以上原因,而又有这样的需求:控件在线程A上创建,又要在线程B中更改其值。所以,Invoke()/BeginInvoke() 就出现了。使线程B可以间接地更改在线程A中创建的控件的值。真正更改控件值的操作仍然是在线程A的上下文中执行。

c#中invoke 和 begininvoke 都什么时候用

这两个方法最常用的场合是:多线程环境下更新控件。

例如,在WinForm程序中有一个后线程不断生成新的数字,而程序需要将这个数字在label1控件上显示,这是就需要调用Label控件的nvoke或者BeginInvok方法。

using System;
using System.Drawing;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        // 委托
        delegate void MyDelegate(int x);
        public Form1()
        {
            InitializeComponent();
            // 启动一个后台线程
            System.Threading.Thread t = 
                new System.Threading.Thread(MyThread);
            t.IsBackground = true;
            t.Start();
        }
        void MyMethod(int x)
        {
            label1.Text = x.ToString();
        }
        void MyThread()
        {
            int x = 0;
            // 实例化委托
            MyDelegate md = MyMethod;
            
            // 线程循环
            while (true)
            {
                x++;
                
                // 利用Invok,调用委托 md, 在label1上显示x的值
                label1.Invoke( md, x);
                
                //  也可以调用BeginInvok
                // label1.BeginInvoke(md, x);
                
                // 休眠1秒钟
                System.Threading.Thread.Sleep(1000);
            }
        }
    }
}

C#为什么要使用Invoke,它和BeginInvoke有什么区别的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于C#为什么要使用Invoke,它和BeginInvoke有什么区别、C#为什么要使用Invoke,它和BeginInvoke有什么区别的信息别忘了在本站进行查找哦。

begininvoke和endinvoke(C#为什么要使用Invoke,它和BeginInvoke有什么区别)

本文编辑:admin

更多文章:


阶乘函数的解析延拓(0的阶乘为什么等于1)

阶乘函数的解析延拓(0的阶乘为什么等于1)

本篇文章给大家谈谈阶乘函数的解析延拓,以及0的阶乘为什么等于1对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。本文目录0的阶乘为什么等于1黎曼猜想是

2026年2月1日 13:15

cadence adc仿真(Cadence教程3——与非电路原理图仿真以及版图绘制)

cadence adc仿真(Cadence教程3——与非电路原理图仿真以及版图绘制)

这篇文章给大家聊聊关于cadence adc仿真,以及Cadence教程3——与非电路原理图仿真以及版图绘制对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。本文目录Cadence教程3——与非电路原理图仿真以及版图绘制如何用Caden

2025年12月27日 10:15

电脑中recent是什么(请问我的电脑里C盘上recent里有很多快捷方式图标,它们有什么用,能删除吗)

电脑中recent是什么(请问我的电脑里C盘上recent里有很多快捷方式图标,它们有什么用,能删除吗)

大家好,今天小编来为大家解答以下的问题,关于电脑中recent是什么,请问我的电脑里C盘上recent里有很多快捷方式图标,它们有什么用,能删除吗这个很多人还不知道,现在让我们一起来看看吧!本文目录请问我的电脑里C盘上recent里有很多快

2026年4月12日 09:15

微信小程序开发环境搭建(微信小程序店铺的开发具体要怎么做)

微信小程序开发环境搭建(微信小程序店铺的开发具体要怎么做)

本篇文章给大家谈谈微信小程序开发环境搭建,以及微信小程序店铺的开发具体要怎么做对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。本文目录微信小程序店铺

2025年7月30日 11:15

filtrate(filtrate是可数名词吗)

filtrate(filtrate是可数名词吗)

大家好,今天小编来为大家解答以下的问题,关于filtrate,filtrate是可数名词吗这个很多人还不知道,现在让我们一起来看看吧!本文目录filtrate是可数名词吗filtered 和filtrate的区别filtrate是可数名词吗

2026年4月26日 14:15

变量名称合法的是(以下合法的变量名是______(JS))

变量名称合法的是(以下合法的变量名是______(JS))

这篇文章给大家聊聊关于变量名称合法的是,以及以下合法的变量名是______(JS)对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。本文目录以下合法的变量名是______(JS)以下哪些是合法的变量名python合法变量名是什么在VB语

2025年6月2日 13:30

安卓permission denied(adb 遇到 Permission denied)

安卓permission denied(adb 遇到 Permission denied)

“安卓permission denied”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看安卓permission denied(adb 遇到 Permission denied)!本文目录adb 遇到 Permission

2025年12月28日 14:30

二郎腿绕两圈(绕二郎腿对身体有什么害处)

二郎腿绕两圈(绕二郎腿对身体有什么害处)

这篇文章给大家聊聊关于二郎腿绕两圈,以及绕二郎腿对身体有什么害处对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。本文目录绕二郎腿对身体有什么害处震惊!“舒服的二郎腿危害重重经常跷二郎腿,对腿有哪些影响什么是二郎腿为什么叫二郎腿绕二郎腿

2025年7月22日 10:45

headache可以分开写吗(英语问题一个句子出现多个动词,是谓语和非谓语我可以分辨,但-ed 和-ing 或to do一直很令我头痛)

headache可以分开写吗(英语问题一个句子出现多个动词,是谓语和非谓语我可以分辨,但-ed 和-ing 或to do一直很令我头痛)

大家好,如果您还对headache可以分开写吗不太了解,没有关系,今天就由本站为大家分享headache可以分开写吗的知识,包括英语问题一个句子出现多个动词,是谓语和非谓语我可以分辨,但-ed 和-ing 或to do一直很令我头痛的问题都

2026年5月3日 21:45

excel函数公式大全讲解乘法(excel乘法公式,财务人士必看)

excel函数公式大全讲解乘法(excel乘法公式,财务人士必看)

各位老铁们好,相信很多人对excel函数公式大全讲解乘法都不是特别的了解,因此呢,今天就来为大家分享下关于excel函数公式大全讲解乘法以及excel乘法公式,财务人士必看的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!

2025年6月28日 18:45

商城html(微信商城和H5商城区别是什么)

商城html(微信商城和H5商城区别是什么)

大家好,关于商城html很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于微信商城和H5商城区别是什么的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!本文目录微信

2025年12月13日 01:45

java开发工具包怎么查看(java.util.* 这一类的包在哪里能查看其内容和作用)

java开发工具包怎么查看(java.util.* 这一类的包在哪里能查看其内容和作用)

大家好,今天小编来为大家解答以下的问题,关于java开发工具包怎么查看,java.util.* 这一类的包在哪里能查看其内容和作用这个很多人还不知道,现在让我们一起来看看吧!本文目录java.util.* 这一类的包在哪里能查看其内容和作用

2026年3月19日 05:00

色彩大全及名称(十二种颜色有哪些)

色彩大全及名称(十二种颜色有哪些)

这篇文章给大家聊聊关于色彩大全及名称,以及十二种颜色有哪些对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。本文目录十二种颜色有哪些24种颜色的名称是什么十二种颜色有哪些十二种颜色分别是红,橙,黄,绿,青,蓝,紫,灰,粉,黑,白,棕。十

2025年6月16日 17:45

源程序的编译与解释的基本概念(编译和解释程序都是什么)

源程序的编译与解释的基本概念(编译和解释程序都是什么)

本篇文章给大家谈谈源程序的编译与解释的基本概念,以及编译和解释程序都是什么对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。本文目录编译和解释程序都是

2025年7月5日 22:30

简易php聊天室(用php做的聊天室CPU占用很高怎么解决)

简易php聊天室(用php做的聊天室CPU占用很高怎么解决)

“简易php聊天室”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看简易php聊天室(用php做的聊天室CPU占用很高怎么解决)!本文目录用php做的聊天室CPU占用很高怎么解决我用PHP做的聊天室,统计在线人数,我在数据库里

2025年11月20日 08:45

delphi源码特殊标记(在delphi里怎么快速将一段代码加成注释)

delphi源码特殊标记(在delphi里怎么快速将一段代码加成注释)

大家好,关于delphi源码特殊标记很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于在delphi里怎么快速将一段代码加成注释的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对

2026年8月27日 21:45

腾讯云官网入口官网(腾讯云服务器的vps入口在哪里)

腾讯云官网入口官网(腾讯云服务器的vps入口在哪里)

本篇文章给大家谈谈腾讯云官网入口官网,以及腾讯云服务器的vps入口在哪里对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。本文目录腾讯云服务器的vps入口在哪里腾讯课堂认证证书怎么免费考云上大陆兑换码入口在哪找腾讯云服务器的vps入口在

2026年4月20日 22:45

程序编程培训费用(编程一年学费多少)

程序编程培训费用(编程一年学费多少)

各位老铁们好,相信很多人对程序编程培训费用都不是特别的了解,因此呢,今天就来为大家分享下关于程序编程培训费用以及编程一年学费多少的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!本文目录编程一年学费多少少儿编程培训费用c+

2025年10月22日 21:45

西门子plc编程软件是什么(西门子PLC编程软件是西门子通用软件吗)

西门子plc编程软件是什么(西门子PLC编程软件是西门子通用软件吗)

大家好,今天小编来为大家解答以下的问题,关于西门子plc编程软件是什么,西门子PLC编程软件是西门子通用软件吗这个很多人还不知道,现在让我们一起来看看吧!本文目录西门子PLC编程软件是西门子通用软件吗s7-200plc用什么编程软件西门子P

2025年6月5日 19:00

编程都有什么(编程的种类都有哪些)

编程都有什么(编程的种类都有哪些)

大家好,如果您还对编程都有什么不太了解,没有关系,今天就由本站为大家分享编程都有什么的知识,包括编程的种类都有哪些的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!本文目录编程的种类都有哪些编程 都学什么编程都有哪些种类编程

2026年1月28日 21:15

近期文章

本站热文

electronics软件(labcenter electronics是什么软件)
2025-05-22 23:45:02 浏览:134
博客是微博吗(博客是微博吗)
2025-05-22 22:45:01 浏览:111
diversity and distribution(悬赏英语短文)
2025-05-23 16:15:02 浏览:107
ios软件开发前景(iOS就业前景怎么样)
2025-05-22 23:00:01 浏览:102
next month(有The next month这个单词吗,和 next month有什么区别)
2025-05-23 02:30:01 浏览:102
patron(patron是什么意思)
2025-05-23 10:30:02 浏览:95
标签列表

热门搜索