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. Go语言基础之接口

    Go语言基础之接口 接口(interface)定义了一个对象的行为规范,只定义规范不实现,由具体的对象来实现规范的细节. 接口 接口介绍 在Go语言中接口(interface)是一种类型,一种抽象的类 ...

  2. Java课程之团队开发(团队介绍)

    一.介绍团队和团队成员 团队名称:凯域软创 团队成员介绍:张某某,崔某某,焦某某,陈某 二.关于团队作品 1.作品名称:课程表 2.你的创意解决了用户的什么需求:查看课程信息的需求 3.你有什么招数用 ...

  3. Java语法细节 - synchronized和volatile

    目录 synchronized关键字 关键字volatile synchronized关键字 synchronized关键字锁住方法和this的不同之处: public synchronized vo ...

  4. linux sqlite3 相关

    数据库sqlite 1 用下载好的安装包安装 linux@ubuntu:~/sqlite3$ sudo dpkg -i libsqlite3-0_3.7.2-1ubuntu0.1_i386_1.deb ...

  5. 反爬虫:利用ASP.NET MVC的Filter和缓存(入坑出坑)

    背景介绍: 为了平衡社区成员的贡献和索取,一起帮引入了帮帮币.当用户积分(帮帮点)达到一定数额之后,就会“掉落”一定数量的“帮帮币”.为了增加趣味性,帮帮币“掉落”之后所有用户都可以“捡取”,谁先捡到 ...

  6. 【RL-TCPnet网络教程】第32章 RL-TCPnet之Telnet服务器

    第32章      RL-TCPnet之Telnet服务器 本章节为大家讲解RL-TCPnet的Telnet应用,学习本章节前,务必要优先学习第31章的Telnet基础知识.有了这些基础知识之后,再搞 ...

  7. 吴恩达机器学习笔记52-异常检测的问题动机与高斯分布(Problem Motivation of Anomaly Detection& Gaussian Distribution)

    一.问题动机 异常检测(Anomaly detection)问题是机器学习算法的一个常见应用.这种算法的一个有趣之处在于:它虽然主要用于非监督学习问题,但从某些角度看,它又类似于一些监督学习问题. 给 ...

  8. [Swift]LeetCode384. 打乱数组 | Shuffle an Array

    Shuffle a set of numbers without duplicates. Example: // Init an array with set 1, 2, and 3. int[] n ...

  9. [Swift]LeetCode814. 二叉树剪枝 | Binary Tree Pruning

    We are given the head node root of a binary tree, where additionally every node's value is either a ...

  10. [Swift]LeetCode894. 所有可能的满二叉树 | All Possible Full Binary Trees

    A full binary tree is a binary tree where each node has exactly 0 or 2 children. Return a list of al ...