转载 VB.NET delegate委托 Invoke
2017-05-11 09:41
183 查看
Event Delegate 在好多地方多看到了,比如在学习web user control 的时侯,还有vb.net remoting object 的时候。
我看了不少文章后,也不是很明白。我在这里写下来,主要是为了我自己以后的回故。同时,也想让大家参考。
要理解event delegate, 当然要先明白什么是event. 其实简单的想,就是"回叫"的机制,比如真实世界里你的老板让你算算今年的税款。 想象一下,你的老板比较烦人,他每隔5分钟会打电话给你,问你做完了吗。 一个到半夜他也没歇着, 当然你也没歇着。 没有EVENT方法,就得写成LOOP语句去检查一个任务是否完成。
后来,到第二年,老板又让你算算这年的税款。这次你主动说了,这次我什么时候做完,什么时候打电话给你。 老板好象还没听明白。你又说了一边"你别打给我,我会打给你的"。老板一想,嘿,这是好办法,这样一来他就不用没完没了打电话, 省了时间还省了电话费。 你算完税后, 打电话给老板的动作就是一个事件, 或者说就是“回叫”。
回到编成上,一共有三种回叫方式, 第一种“interface”, 第二种“function pointer (方程指针)”, 第三种“delegate (委托)”。 我对第三种方式有点了解,就是委托。不过看网上其它的教程, 讲委托是集合interface 和 function pointer 的优点。不过速度上好象不如function pointer, 但可以象interface 一样是强类行的。 强类行就是说, 调用委托的方法时,它的参数和返回值是必须和声明委托时的方法和返回对应起来。
编程上看,delegate是非常简单的。
看看下面这几个图片,是个完整的,简单的小demo。
总共就三个文件, 分别是: delegate.vb, Employee.vb, Manager.vb 这是一个winform 应用程序
delegate.vb 里的代码就一行。 就是定义delegate 方法的签名, 委托有什么参数, 有没有返回值。 这里的例子代码只要一个参数,就是老板的名字。 也不需要返回值。
所以用的是sub. 如果要有返回值, 就要用function。 下面是function 的代码, delegate function CallBackManager(byval name as String) as Boolean
Employee.vb 里代码是下面代码内容:
1。 在employee内声明这个委托, 也就是说employee 有这个属性了。
2和3。 是来给employee 的这个委托属性付值。
4, 这行是employee 做完计算,然后触发打电话的事情。 invoke (触发)就是触发mdlgCallBackManager 指向的方法。 这个被指向的方法在下一段代码中。我同时又把deleagte.vb里的那行代码贴在下面了, 并用红线连接着。 这你就注意到他们的签名要一样。 也就是所谓的强类型了。
最后,就是manager form 里的代码。 下面就是。先是创建employee的实例, 然后在form load 方法里注册我要把我的哪个方法委托给employee,换句话说就是付值给employee里的mdlgCallBackManager 属性。 我把Callme 委托给employee, 那么他签名也是要一致的。
好, 如果我运行代码,然后点button1, 我就会看到下面一样的内容
这是我所理解的delegate 内容, Event和delegate 其实是一样。 过两天我要把上面的代码重写成event. 比较后会觉很相似。 delegate 还有异步的方法。 因为里面有很复杂的技术问题, 所以要以后在写写,。 坦白的讲, 这个很复杂的技术问题就是我自己还没太搞明白呢。
invoke
在VB6平台是没有多线程这一说的,而VB.NET有了这个概念,这样对于同步模块化操作是很方面的.
可是同样也存在着问题.跨线程操作COM有时候会异常.
托管程序~~~每一个线程都有上下文,主线程(或者说创建控件的线程)操作COM控件是没问题的.
但是其他线程就不行了,可能会引发异常.
但是有一个叫"托管调用"的函数---invoke,使得跨线程操作是安全的.
比如说一个控件在FORM里,一个线程(非主线程)去操作这个控件,就需要invoke调用FORM的函数再去操作(自写函数),这样就安全了.
我看了不少文章后,也不是很明白。我在这里写下来,主要是为了我自己以后的回故。同时,也想让大家参考。
要理解event delegate, 当然要先明白什么是event. 其实简单的想,就是"回叫"的机制,比如真实世界里你的老板让你算算今年的税款。 想象一下,你的老板比较烦人,他每隔5分钟会打电话给你,问你做完了吗。 一个到半夜他也没歇着, 当然你也没歇着。 没有EVENT方法,就得写成LOOP语句去检查一个任务是否完成。
后来,到第二年,老板又让你算算这年的税款。这次你主动说了,这次我什么时候做完,什么时候打电话给你。 老板好象还没听明白。你又说了一边"你别打给我,我会打给你的"。老板一想,嘿,这是好办法,这样一来他就不用没完没了打电话, 省了时间还省了电话费。 你算完税后, 打电话给老板的动作就是一个事件, 或者说就是“回叫”。
回到编成上,一共有三种回叫方式, 第一种“interface”, 第二种“function pointer (方程指针)”, 第三种“delegate (委托)”。 我对第三种方式有点了解,就是委托。不过看网上其它的教程, 讲委托是集合interface 和 function pointer 的优点。不过速度上好象不如function pointer, 但可以象interface 一样是强类行的。 强类行就是说, 调用委托的方法时,它的参数和返回值是必须和声明委托时的方法和返回对应起来。
编程上看,delegate是非常简单的。
看看下面这几个图片,是个完整的,简单的小demo。
总共就三个文件, 分别是: delegate.vb, Employee.vb, Manager.vb 这是一个winform 应用程序
delegate.vb 里的代码就一行。 就是定义delegate 方法的签名, 委托有什么参数, 有没有返回值。 这里的例子代码只要一个参数,就是老板的名字。 也不需要返回值。
所以用的是sub. 如果要有返回值, 就要用function。 下面是function 的代码, delegate function CallBackManager(byval name as String) as Boolean
Employee.vb 里代码是下面代码内容:
1。 在employee内声明这个委托, 也就是说employee 有这个属性了。
2和3。 是来给employee 的这个委托属性付值。
4, 这行是employee 做完计算,然后触发打电话的事情。 invoke (触发)就是触发mdlgCallBackManager 指向的方法。 这个被指向的方法在下一段代码中。我同时又把deleagte.vb里的那行代码贴在下面了, 并用红线连接着。 这你就注意到他们的签名要一样。 也就是所谓的强类型了。
最后,就是manager form 里的代码。 下面就是。先是创建employee的实例, 然后在form load 方法里注册我要把我的哪个方法委托给employee,换句话说就是付值给employee里的mdlgCallBackManager 属性。 我把Callme 委托给employee, 那么他签名也是要一致的。
好, 如果我运行代码,然后点button1, 我就会看到下面一样的内容
这是我所理解的delegate 内容, Event和delegate 其实是一样。 过两天我要把上面的代码重写成event. 比较后会觉很相似。 delegate 还有异步的方法。 因为里面有很复杂的技术问题, 所以要以后在写写,。 坦白的讲, 这个很复杂的技术问题就是我自己还没太搞明白呢。
invoke
在VB6平台是没有多线程这一说的,而VB.NET有了这个概念,这样对于同步模块化操作是很方面的.
可是同样也存在着问题.跨线程操作COM有时候会异常.
托管程序~~~每一个线程都有上下文,主线程(或者说创建控件的线程)操作COM控件是没问题的.
但是其他线程就不行了,可能会引发异常.
但是有一个叫"托管调用"的函数---invoke,使得跨线程操作是安全的.
比如说一个控件在FORM里,一个线程(非主线程)去操作这个控件,就需要invoke调用FORM的函数再去操作(自写函数),这样就安全了.
相关文章推荐
- 用JScript实现VB.Net,C#的[委托Delegate]:
- .net CallbackOnCollectedDelegate 垃圾回收问题。 (Handle::Invoke”类型的已垃圾回收委托进行了回调。)
- [VB.NET]委托调用---invoke
- 用JScript实现VB.Net,C#的[委托Delegate]:
- vb.net里的delegate的使用,委托使用
- 用JScript实现VB.Net,C#的[委托Delegate]:
- [VB.NET].net2003里委托是不是没有begininvoke?只有invoke?
- VB.NET中使用委托(Delegate)来注册回调(callback)函数
- VB.net 调用带参数存储过程(转载)
- VB.NET 的Stream(转载)
- [转载]VB.NET下获取硬盘信息的几种方法
- [转载]用VB.Net编织未来--比尔.盖茨
- VB.net下有个函数strconv可以进行简体繁体转换(转载)
- [转载]VB.net程序的打包问题示例!
- Vb.net多线程条件下,给委托方法传参数
- [VB.NET]在线程里频繁的进行委托操作主界面的ui是不是效果不好?
- VB.NET中的事件与委托(警察抓小偷)
- Mcad学习笔记之委托再理解(delegate的构造器,MulticastDelegate,BeginInvoke,EndInvoke,Invoke4个方法的探讨)
- [转载]获得计算机硬件信息(VB.net)
- 用VB.net实现Smartphone中进程启动 (转载)