我有一个使用TcpClient的BeginAcceptTcpClient()方法的线程,它类似于:
// this gets set elsewhere
ManualResetEvent _doneListening = new ManualResetEvent(false); 。。在线程过程中
while (true)
{
var result = BeginAcceptTcpClient(null, null);
var index = WaitHandle.WaitAny(new [] { _doneListening, result.AsyncWaitHandle });
if (0 == index)
{
break;
}
// do something with EndAcceptTcpClient(result)
}现在,根据MSDN的文档:
异步BeginAcceptTcpClient操作必须通过调用EndAcceptTcpClient方法来完成。
我的问题与我的线程的取消/停止情况有关--也就是在_doneListening.Set()之后--我真的不想要任何TcpClients了。同时,我不想泄露记忆。
是否有必要调用EndAcceptTcpClient()?这将阻止,我当然不希望它(我需要一个快速线程退出)。但如果不是这样,它会漏出内存吗?MSDN提示,开始必须与结束配对。为了有效地取消可能正在进行的异步操作,我应该遵循不同的模式吗?
发布于 2012-08-29 15:16:33
如果您已经关闭/释放了EndAcceptTcpClient,则TcpClient不会阻塞。所以当你听完了,然后关闭它。它将在响应EndAcceptTcpClient时抛出一个异常,但这是可以的。您可以安全地忽略/丢弃异常。
发布于 2012-08-29 16:54:29
建议在开始/结束模式中调用End*方法。如果你不这样做,就会有一些资源“泄露”。您应该调用TcpListener.Stop来关闭侦听器,然后调用EndAcceptTcpClient。
如果侦听器再次绑定,停止可能引发异常。因此,您可能需要检查它,或者检查IsBound (但是在检查IsBound和Stop之间,您仍然可以获得一个新的绑定).
https://stackoverflow.com/questions/12181139
复制相似问题