这是一个很色咪咪的话题,色在哪里谁也不知道,估计是色在“深入”,但是最后其实也只是一般深入,所以只好称之为委托研究之色狼篇。
哎我写这些东西只是为了自己总结和加深记忆,你们不要想多了。
首先来总结一下采用回调的委托。
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见下面的文章