0

我有这堂课:

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);
}

我觉得应该有更正确的方法,有什么建议吗?

4

1 回答 1

1

这将起作用,方法是创建一个捕获socketcallback. 通常,它会完成工作。但是,您必须了解捕获上下文的作用域规则,并知道是socket指每次迭代变量还是迭代之间共享的变量。为了我的钱,因此不值得在这里冒险。

但存在其他机制:

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

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

是否值得改变取决于它的容量有多大。

于 2013-04-23T07:27:18.000 回答