我有这堂课:
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);
}
我觉得应该有更正确的方法,任何建议?
答案 0 :(得分:1)
通过创建阻碍socket
和callback
的捕获上下文,这将有效。通常,它会完成工作。但是,您必须必须了解捕获上下文的范围规则,并了解socket
是否指的是每次迭代变量与迭代之间共享的变量。对于我的钱,因此不值得在这里冒险。
但存在其他机制:
您可以将显式状态对象作为最后一个参数传递给BeginConnect
,并作为r.AsyncState
进行访问;这允许你做一些事情,比如重复使用单个委托实例来避免分配,但你仍然需要某种元组来包含套接字和回调
您可以使用ConnectAsync
;这在重用委托和拥有状态对象(这次称为UserToken
)方面具有相同的优点,但是您不需要打包套接字,因为它被公开为{{1在事件处理程序中 - 但它需要一个ConnectSocket
实例,因此在分配方面它不会比SocketAsyncEventArgs
多得多,但它 意味着你正在使用最新(也是最有效的)API
是否值得改变取决于它的体积大小。