0

我有一个使用TcpClient'sBeginAcceptTcpClient()方法的线程。它类似于:

// 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 提示 Begin 必须与 End 配对。我应该遵循不同的模式来有效地取消可能正在进行的异步操作吗?

4

2 回答 2

2

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

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

于 2012-08-29T16:54:29.057 回答
1

EndAcceptTcpClient如果您关闭/处置了 TcpClient,则不会阻止。所以当你听完后关闭它。它将抛出异常以响应 EndAcceptTcpClient,但没关系。您可以安全地忽略/丢弃异常。

于 2012-08-29T15:16:33.397 回答