马桶里的肌肉

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

最近用到了委托,类似于C里面函数指针一样的东西,总结一下,错误的地方以后发现再来改。

  首先说到委托,不得不先了解同步(sync),非同步(async)和阻塞与非阻塞的概念(Block)

  1.同步与异步的区别在于消息的处理机制,同步为自己关注处理的结果,而异步为等待消息(回调函数)。

  2.阻塞与非阻塞的区别在于:等待(异步)或者关注(同步)的同时:是否能做其他事情。

 

    关于Delegate,委托的用处大概分为以下2种:

    1.起到函数指针的作用,将实例的方法或者类的共享方法当做参数传入过程当中,以便在不同的环境要求下,采用不同的处理方式。但是要求委托的签名与其委托的方法签名相同。

    2.作为异步处理的回调机制如下转载,添加了一些内容

 

 

实现异步调用的步骤和机理 
假设有这样一个方法(Method),它接受一个班级的名称,然后查询数据库,返回这个班级所有同学的名单。 

Class DemoClass

 public shared Function GetStudentsList(ClassName as String)  as String()

'查询数据库

'其它操作

 End function

End Class

如果对这样一个方法进行异步调用的话,那么你首先需要定义一个有同样方法签名(Function Signature)的委托(Delegate,比如 

Delegate Function GetStudentListDelegate (ClassName as String) as String()

下一步,你需要生成一个委托实例(Instance),然后将这个委托和你的真正的方法捆绑起来,如 

Dim delegate as GetStudentListDelegate

GetStudentListDelegate = AddressOf DemoClass.GetStudentsList

(为了简单起见,这里使用了静态方法,这其实不是必须的
当你做到这步的时候,.NET的编译器在后台为你的委托增加了几个方法,它们是Invoke, BeginInvoke, EndInvoke. 
如果你使用Invoke方法,那么其效果是同步调用,比如 

delegate.Invoke("class90")

在这种情况下,委托将输入参数"class90"传递给方法GetStudentsList,然后将这个方法的返回值返回给用户。

 

异步的委托回调机制见下篇

   

posted on 2013-03-14 13:40  马桶里的肌肉  阅读(153)  评论(0编辑  收藏  举报