使用.Net 4.0。我有一些代码尝试使用BeginConnect和回调打开连接。如果用户试图在接下来的几分钟内停止编程,我会尝试断开连接。此时,我设置了一个标志,指示是否需要从回调中调用EndConnect。如果该标志设置为false,我跳过EndConnect,因为无论如何套接字都已被删除。
此时用户可以立即尝试再次连接。我不认为这发生了,以防万一。现在创建一个新套接字并再次调用BeginConnect。
永远不要调用EndConnect方法吗?
答案 0 :(得分:3)
在所有情况下(除了一个 [1] ),对BeginZZZ
的调用都需要匹配的EndZZZZ
。
否则,非托管资源将被泄露,很可能行动ZZZZ
将无法正确完成 - 可能会在以后破坏ZZZZ
的进一步使用。
套接字非常强大,可以防止滥用(IP堆栈必须处理网络故障和数据包乱序),但这并不是一种好的做法。
如果您使用标记来跟踪“关闭”,最好拨打EndConnect
然后立即关闭套接字。在所有连接本身都失败后,不需要断开连接(EndConnect
抛出SocketException
)。类似的东西:
mySocket.BeginConnect(address, port, ia => {
if (shuttingDown) {
try {
mySocket.EndConnect(ia);
mySocket.BeginDisconnect(false, iaa = {
try {
mySocket.EndDisconnect(iaa);
} catch (Exception) { /* Ignore */ }
}, null);
} catch (SocketException) { /* Ignore */ }
} else {
// Normal connection handling
}
}, null);
还使用异步断开连接以避免阻塞。
[1] WinForms中的异常为Control.BeginInvoke
,其中明确记录了异常。