2012-12-20 93 views
1

使用VB .Net異步套接字方法時,應如何定義回調函數?新AsyncCallback(AddressOf函數)和AddressOf函數之間的區別

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) 

AND

AddressOf OnReceive 

兩者產生相同的結果。

那麼哪個是正確的? 是否有可能創建AsyncCallback對象作爲變量,以避免創建一個新的每個接收?

回答

1

兩個選項是正確的(MSDN):

AddressOf運算符可被用作一個代表構造的操作數,或者它可以在將委託的類型可以通過以下確定的上下文中使用編譯器。

  • New AsyncCallback(AddressOf OnReceive):在這裏,你可以使用AddressOf運算作爲代表構造函數的操作數。
  • AddressOf OnReceive:這裏,委託的類型(AsyncCallback)由編譯器自動推斷。

第一個選項更明確,後者更緊湊。使用哪一個是品味的問題。


關於緩存的AsyncCallback對象:是的,這是可能的,但我真的懷疑,性能優勢(如果有的話)是值得冒這個險。

相關問題