C#中invoke和beginInvoke的使用

1.Control类中的invoke和beginInvoke的定义

  1. invoke的含义是:在拥有此控件的基础窗口句柄的现呈上同步执行指定的委托(同步)
  2. beginInvoke的含义是:在创建控件的基础句柄所在线程上异步执行的委托(异步)
  • 句柄(Handle):

​ 句柄是一种抽象的概念,隐藏了内核实现的细节,同时为调用提供了方便,保证了内核的安全性。形象的比喻为“用一个小东西拎起一堆东西的柄”。根据他的概念,我们可以将指针看作一种形式的句柄,但他拥有更独特的含义:指向内存的某个地址。

​ 在系统中有很多内核对象,这些对象大多很庞大,拥有很多的属性。当需要传输这些属性时,首先不能直接复制,因为这样会很慢;其次也不能直接调用这些属性的首地址,这样会暴露属性的位置,进而导致属性被随意更改,影响系统的稳定;最后因为内存的地址可能会随时更改(Windows基于虚拟内存,其内存管理器常常在内存中来回移动对象),直接调用会导致以后使用时找不到地址。

​ 在这个基础上,采用一种句柄的概念。它是一种对对象的进一步抽象的过程(理解面向对象的概念),它会在进程的地址空间中设置一张表格,里面保存着某个对象的编号和这个编号对应的地址,通过这个地址去引用这个对象。这个编号就是句柄。句柄的作用就是将对象的真实地址隐藏起来,同时提供一种对该对象的映射地址方便调用。这样既能保证对象的安全性,也能保证调用的便利。

2.invoke的用法

​ 上面的解释通俗的来说就是在一个应用程序的主线程上调用执行指定的委托。主要目的是让工作的线程完成绝大部分的运算工作,将纯粹的界面更新放到UI线程中去完成,达到减轻UI线程负担的目的(避免UI无响应)。

//this.invoke的使用方法
//第一步:定义修改UI的方法
private void ModifyButton( bool _b )
{
this.Button1.Enabled = _b;
}
//第二步:声明第一步方法的委托
private delegate void ModifyButton_dg( bool _b );
//第三步:调用委托
private void Calldelgate( )
{
/*在Windows窗体应用程序中使用this.Invoke 在WPF应用程序中使用this.Dispatcher.Invoke*/
this.Invoke( new ModifyButton_dg( ModifyButton ) ,new object[]{false});
}
//第四步:在非UI的线程中调用
//创建线程
Thread _t = new Thread( new ThreadStart( threadmethod ));
_t.Start();
//线程入口
private void threadmethod ()
{
Calldelgate();
}

C#之Invoke学习的更多相关文章

  1. .NET学习之路----我对P/Invoke技术的理解(一)

    看了P/Invoke技术的介绍,于是想写下点东西,东西包含两个部分:知识的纪录和我的理解及疑问. r托管代码中调用非托管API函数的过程 1.定位包含API的DLL: 2.载入DLL 3.找到DLL中 ...

  2. C#学习之在辅助线程中修改UI控件----invoke方法

    Invoke and BeginInvoke 转载地址:http://www.cnblogs.com/worldreason/archive/2008/06/09/1216127.html 在Invo ...

  3. 学习AOP之认识一下Spring AOP

    心碎之事 要说知道AOP这个词倒是很久很久以前了,但是直到今天我也不敢说非常的理解它,其中的各种概念即抽象又太拗口. 在几次面试中都被问及AOP,但是真的没有答上来,或者都在面上,这给面试官的感觉就是 ...

  4. Java学习之反射机制及应用场景

    前言: 最近公司正在进行业务组件化进程,其中的路由实现用到了Java的反射机制,既然用到了就想着好好学习总结一下,其实无论是之前的EventBus 2.x版本还是Retrofit.早期的View注解框 ...

  5. Linux学习之探索文件系统

    Linux,一起学习进步-    ls With it, we can see directory contents and determine a variety of important file ...

  6. Linux.NET学习手记(8)

    上一回合中,我们讲解了Linux.NET面对OWIN需要做出的准备,以及介绍了如何将两个支持OWIN协议的框架:SignalR以及NancyFX以OwinHost的方式部署到Linux.NET当中.这 ...

  7. WCF学习之旅—HTTP双工模式(二十)

    WCF学习之旅—请求与答复模式和单向模式(十九) 四.HTTP双工模式 双工模式建立在上文所实现的两种模式的基础之上,实现客户端与服务端相互调用:前面介绍的两种方法只是在客户端调用服务端的方法,然后服 ...

  8. Java学习之注解Annotation实现原理

    前言: 最近学习了EventBus.BufferKinfe.GreenDao.Retrofit 等优秀开源框架,它们新版本无一另外的都使用到了注解的方式,我们使用在使用的时候也尝到不少好处,基于这种想 ...

  9. RPC远程过程调用学习之路(一):用最原始代码还原PRC框架

    RPC: Remote Procedure Call 远程过程调用,即业务的具体实现不是在自己系统中,需要从其他系统中进行调用实现,所以在系统间进行数据交互时经常使用. rpc的实现方式有很多,可以通 ...

随机推荐

  1. 4.SSM整合_多表_多对多的增删改查

    多对多关系,课程和学生 接口 public interface CourseMapper { /** * 获取所有课程 * @return * @throws Exception */ public ...

  2. 弄懂CNN,然后提升准确率4.21-4.27

    英语: 1.每天背单词,75起步.(这周没怎么背,考虑调整了) 2.并背王江涛图画作文一:传统文化(这周没背,但肯定要做) 学校: 0.吴恩达ML 1.毕设一:可视化,肺癌基因突变,深度学习(那么作图 ...

  3. rest_framework之权限源码剖析

    权限问题 1.models.py 2.用户类型: 3.views.py: 假设订单相关业务(只有SVIP用户有权限) 假设用户信息相关业务(只有普通用户.VIP有权限) 4.运行结果: 基本使用 以上 ...

  4. Linux shell编程— 命令替换

    有两种方法可以将命令输出赋给变量 反引号字符(`) $()格式 命令替换允许你将shell 命令的输出赋给变量 要么用一对反引号把整个命令行围起来: testing=`data` 要么使用$()格式 ...

  5. Linux 搭建Nginx+uWSGI+Django环境

    安装环境 sudo apt-get install nginx sudo apt install python3 sudo apt install python3-pip 使用 sudo pip3 i ...

  6. 三、糖醋鲤鱼(Sweet and sour carp)

    糖醋鲤鱼是用鲤鱼制作的一道山东济南传统名菜,为鲁菜的代表菜品之一 ,色泽金黄,外焦内嫩,酸甜可口,香鲜味美. 菜品历史 <诗经>载:岂食其鱼,必河之鲤.<济南府志>上早有&qu ...

  7. barrel_shift

    barrel_shift的目的就是在一个bus中根据idx动态选择一部分数据输出如: *dw-:]; -:];// 0~132 *dw-:]; 上面就要求从256的数据单元中选择124个数据单元输出, ...

  8. JavaEE开发之Spring中的依赖注入与AOP编程

    上篇博客我们系统的聊了<JavaEE开发之基于Eclipse的环境搭建以及Maven Web App的创建>,并在之前的博客中我们聊了依赖注入的相关东西,并且使用Objective-C的R ...

  9. [Swift]LeetCode190. 颠倒二进制位 | Reverse Bits

    Reverse bits of a given 32 bits unsigned integer. Example 1: Input: 00000010100101000001111010011100 ...

  10. [Swift]LeetCode309. 最佳买卖股票时机含冷冻期 | Best Time to Buy and Sell Stock with Cooldown

    Say you have an array for which the ith element is the price of a given stock on day i. Design an al ...