带取消的IAsyncResult开始/结束模式

时间:2012-08-29 15:12:08

标签: c# .net

我有一个使用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配对。我是否应该采用不同的模式来有效取消可能正在进行的异步操作?

2 个答案:

答案 0 :(得分:2)

建议在Begin / End模式中调用End *方法。如果你不这样做会有一些“泄漏”的资源。您应该致电TcpListener.Stop关闭听众,然后拨打EndAcceptTcpClient

如果侦听器再次绑定,则Stop可能会抛出异常。因此,您可能需要检查一下,或检查IsBound(但在检查IsBoundStop之间,您仍然可以获得新的绑定)...

答案 1 :(得分:1)

如果您已关闭/处置TcpClient,

EndAcceptTcpClient将不会阻止。所以当你完成听力然后关闭它。它会在响应EndAcceptTcpClient时抛出异常,但这没关系。您可以放心地忽略/放弃异常。