1

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オブジェクトを変数として作成して、受信するたびに新しいオブジェクトを作成する必要をなくすことはできますか?

4

1 に答える 1

1

どちらのオプションも正しいです(MSDN):

AddressOf演算子は、デリゲートコンストラクターのオペランドとして使用することも、コンパイラーがデリゲートのタイプを判別できるコンテキストで使用することもできます。

  • New AsyncCallback(AddressOf OnReceive):ここでは、AddressOf演算子をデリゲートコンストラクターのオペランドとして使用します。
  • AddressOf OnReceive:ここで、デリゲートのタイプ(AsyncCallback)はコンパイラーによって自動的に推測されます。

前者のオプションはより明確で、後者のオプションはよりコンパクトです。どちらを使用するかは好みの問題です。


AsyncCallbackオブジェクトのキャッシュについて:はい、可能ですが、パフォーマンス上の利点(ある場合)が面倒な価値があるかどうかは本当に疑わしいです。

于 2012-12-20T07:20:34.220 に答える