多个状态对象到Socket.Begin *

时间:2013-04-23 07:18:03

标签: c# asynchronous

我有这堂课:

class NetworkManager {
    public void Connect(IPAddress address, int port, Action callback) {
        Socket socket = new Socket(...);
        socket.BeginConnect(address, port, r => EndConnect(r, socket, callback), null);
    }

    private void EndConnect(IAsyncResult r, Socket socket, Action callback) {
        //End the connection and call the callback method
    }
}

这种发送多个状态对象的方法是否很好?

如果我把开头放在一个循环中,我还能通过正确的套接字吗?

Socket socket;
for(...){
    socket = new Socket(...);
    socket.BeginConnect(address, port, r => EndConnect(r, socket, callback), null);
}

我觉得应该有更正确的方法,任何建议?

1 个答案:

答案 0 :(得分:1)

通过创建阻碍socketcallback的捕获上下文,这将有效。通常,它会完成工作。但是,您必须必须了解捕获上下文的范围规则,并了解socket是否指的是每次迭代变量与迭代之间共享的变量。对于我的钱,因此不值得在这里冒险。

但存在其他机制:

  • 您可以将显式状态对象作为最后一个参数传递给BeginConnect,并作为r.AsyncState进行访问;这允许你做一些事情,比如重复使用单个委托实例来避免分配,但你仍然需要某种元组来包含套接字和回调

  • 您可以使用ConnectAsync;这在重用委托和拥有状态对象(这次称为UserToken)方面具有相同的优点,但是您不需要打包套接字,因为它被公开为{{1在事件处理程序中 - 但它需要一个ConnectSocket实例,因此在分配方面它不会比SocketAsyncEventArgs多得多,但它 意味着你正在使用最新(也是最有效的)API

是否值得改变取决于它的体积大小。