首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >新AsyncCallback(AddressOf函数)与AddressOf函数的区别

新AsyncCallback(AddressOf函数)与AddressOf函数的区别
EN

Stack Overflow用户
提问于 2012-12-20 15:12:40
回答 1查看 1.3K关注 0票数 1

在使用VB的.Net异步套接字方法时,回调函数应该如何定义?

代码语言:javascript
复制
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

在上面的代码示例中,我测试了这两种方法

代码语言:javascript
复制
New AsyncCallback(AddressOf OnReceive)

代码语言:javascript
复制
AddressOf OnReceive

两者产生的结果是一样的。

那么哪一个是正确的呢?是否可以将AsyncCallback对象创建为变量,以避免每次接收时都必须创建一个新对象?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-20 15:20:34

两个选项都正确(MSDN):

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

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

第一个选项更明确,后一个选项更紧凑。选择哪一个是个人喜好的问题。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13966997

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档