使用VB .Net异步套接字方法时,应如何定义回调函数?
Private Sub ServerRunTime(Optional ByRef ListeningAddress As String = "", Optional ByRef Port As Short = 31337)
Dim Listener As Socket = ConfigListener(ListeningAddress, Port)
Listener.Listen(32)
Listener.BeginAccept(New AsyncCallback(AddressOf OnAccept), Listener)
End Sub
Private Sub OnAccept(ByVal AcceptResult As IAsyncResult)
Dim Listener As Socket = CType(AcceptResult.AsyncState, Socket)
Dim aClientObj As New ClientObj
Dim ClientID As Integer = Clients.Count
aClientObj.ClientSok = Listener.EndAccept(AcceptResult)
aClientObj.ClientID = ClientID
Clients.Add(aClientObj)
Clients(ClientID).ClientSok.BeginReceive(Clients(ClientID).RecvBuffer, 0, Clients(ClientID).RecvBuffer.Length, SocketFlags.None, AddressOf OnReceive, ClientID)
Listener.BeginAccept(New AsyncCallback(AddressOf OnAccept), Listener)
End Sub
在上面的代码示例中,我测试了两个
New AsyncCallback(AddressOf OnReceive)
和
AddressOf OnReceive
并且都产生相同的结果。
哪个是正确的? 是否可以将AsyncCallback对象创建为变量,以避免每次接收都创建一个新对象?
答案 0 :(得分:1)
两个选项都是正确的(MSDN):
AddressOf运算符可以用作委托构造函数的操作数,也可以在编译器可以确定委托类型的上下文中使用。
New AsyncCallback(AddressOf OnReceive)
:在这里,您使用AddressOf运算符作为委托构造函数的操作数。AddressOf OnReceive
:此处,编译器会自动推断出委托的类型(AsyncCallback
)。第一个选项更明确,后者更紧凑。使用哪一个是品味问题。
关于缓存AsyncCallback对象:是的,这是可能的,但我真的怀疑性能优势(如果有的话)值得麻烦。