1

使用VB .Net异步socket方法时,回调函数应该如何定义?

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 对象创建为变量以避免每次接收都创建一个新对象?

4

1 回答 1

1

两个选项都是正确的(MSDN):

AddressOf 运算符可以用作委托构造函数的操作数,也可以在编译器确定委托类型的上下文中使用。

  • New AsyncCallback(AddressOf OnReceive): 在这里,您使用 AddressOf 运算符作为委托构造函数的操作数。
  • AddressOf OnReceive: 在这里,委托 ( AsyncCallback) 的类型由编译器自动推断。

第一个选项更明确,后一个更紧凑。使用哪一个是口味问题。


关于缓存 AsyncCallback 对象:是的,这是可能的,但我真的怀疑性能优势(如果有的话)是否值得麻烦。

于 2012-12-20T07:20:34.220 回答