最近用到了委托,类似于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,然后将这个方法的返回值返回给用户。
异步的委托回调机制见下篇