我有一个使用TcpClient
的{{1}}方法的主题。它类似于:
BeginAcceptTcpClient()
..和线程程序
// this gets set elsewhere
ManualResetEvent _doneListening = new ManualResetEvent(false);
现在,根据MSDN的文档:
必须完成异步BeginAcceptTcpClient操作 调用EndAcceptTcpClient方法。
我的问题与我的线程的取消/停止情况有关 - 也就是说,在while (true)
{
var result = BeginAcceptTcpClient(null, null);
var index = WaitHandle.WaitAny(new [] { _doneListening, result.AsyncWaitHandle });
if (0 == index)
{
break;
}
// do something with EndAcceptTcpClient(result)
}
之后 - 我真的不想要任何更多的TcpClients。与此同时,我不想泄漏记忆。
是否需要调用EndAcceptTcpClient()?这将阻止,我当然不希望它(我想要一个快速线程退出)。但是它会泄漏内存吗? MSDN暗示Begin必须与End配对。我是否应该采用不同的模式来有效取消可能正在进行的异步操作?
答案 0 :(得分:2)
建议在Begin / End模式中调用End *方法。如果你不这样做会有一些“泄漏”的资源。您应该致电TcpListener.Stop
关闭听众,然后拨打EndAcceptTcpClient
。
如果侦听器再次绑定,则Stop可能会抛出异常。因此,您可能需要检查一下,或检查IsBound
(但在检查IsBound
和Stop
之间,您仍然可以获得新的绑定)...
答案 1 :(得分:1)
EndAcceptTcpClient
将不会阻止。所以当你完成听力然后关闭它。它会在响应EndAcceptTcpClient时抛出异常,但这没关系。您可以放心地忽略/放弃异常。