深入研究Delegate(Interface,Callback)

  这是一个很色咪咪的话题,色在哪里谁也不知道,估计是色在“深入”,但是最后其实也只是一般深入,所以只好称之为委托研究之色狼篇。

  哎我写这些东西只是为了自己总结和加深记忆,你们不要想多了。

 

  首先来总结一下采用回调的委托。

 

 

 1  
 2 
 3 Public Class DelegateEXP
 4 
 5      Public Delegate Function StrDelegate(ByVal a As String) As String   '定义一个委托
 6 
 7     
 8 
 9      Public Function Str(ByVal a As String) As String   '定义一个与委托签名相同的方法
10 
11         Return a
12 
13      End Function
14 
15  
16 
17      Private Dlg As StrDelegate = New StrDelegate(AddressOf Str)       '实现委托
18 
19  
20 
21  
22 
23  
24 
25      Private Class Para            '定义一个结构为传入参数,AsyncState
26 
27  
28 
29         Public ParaA As Int16
30 
31         Public ParaB As String
32 
33      End Class
34 
35  
36 
37     Public Sub Dowork()
38 
39         '操作Dlg委托,调用invoke方法,begininvoke方法等
40 
41  
42 
43         Dim Paras As Para = New Para   '初始化参数
44 
45         Dim Ar As System.IAsyncResult   '委托的Begininvoke方法返回一个System.IAsyncResult类型。
46 
47  
48 
49         Ar = Dlg.BeginInvoke("test", MycallbackFunc, Paras)   '异步调用的三个参数1.委托的参数 2.回调函数 3.一个OBject类型的参数
50 
51         MsgBox("BeginInvoke")
52 
53  
54 
55         '---------------回调---------------
56 
57  
58 
59         If Ar.IsCompleted Then
60 
61             '如果委托的调用已经完成,则BLABLABLA......
62 
63         End If
64 
65  
66 
67         Dim RE As String
68 
69         Try
70 
71             'RE = Dlg.EndInvoke(Ar)    'EndIvoke方法返回  委托方法的返回值,需要一个System.IAsyncResult类型的参数
72 
73             'MsgBox("EndInvoke成功")
74 
75         Catch ex As Exception
76 
77  
78 
79         End Try
80 
81     End Sub

 

 

 

 

    Private MycallbackFunc As AsyncCallback = AddressOf FinishWork   '定义一个回调函数,并实现为FinishWork(ByVal ar As IAsyncResult)

 

    Public Sub FinishWork(ByVal ar As IAsyncResult)   '回调函数,必须与AsyncCallback函数有一样的签名,也就是f(IAsyncResult)

        '处理EndIvoke后的事情

 

        Dim paras As Para = CType(ar.AsyncState, Para)   '将传入的参数使用

        MsgBox("回调函数在处理,马上结束进程")

    End Sub

 

End Class

 

 

1.首先先为你需要异步执行的方法定义了一个与之签名相同的委托

2.使用委托 Private Dlg As StrDelegate = New StrDelegate(AddressOf Str),BeginInvoke

3.定义一个方法,为异步执行之后回调的方法,这个方法要与AsyncCallback函数有一样的签名,也就是f(IAsyncResult)

4.使用回调函数 Private MycallbackFunc As AsyncCallback = AddressOf FinishWork  

 

是不是色魔的世界就这么结束了呢,没有,色魔还需要一个更强大的解释,那么,来吧

 首先来说一些我不知道大家都知道的东西。

1.委托的BeginInvoke方法返回的其实并不是一个IAsyncResult变量,因为如果仅仅是一个IAsyncResult并不会包含任何实现代码,所以返回的是一个实现了IAsyncResult接口的类的实例,那么这个类是谁呢这个并不重要,或许是AsyncResult,我们就可以使用其中实现了IAsyncResult接口的属性和方法。

2.关于回调方法,回调方法还是为BeginInvoke在后台创建的新中最后的方法。

3.关于Control.Invoke见下面的文章

  

 

 

 

转载于:https://www.cnblogs.com/nevermorez/archive/2013/03/14/2960600.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值