首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >取消IAsyncResult开始/结束模式

取消IAsyncResult开始/结束模式
EN

Stack Overflow用户
提问于 2012-08-29 15:12:08
回答 2查看 2K关注 0票数 0

我有一个使用TcpClientBeginAcceptTcpClient()方法的线程,它类似于:

代码语言:javascript
复制
// this gets set elsewhere
ManualResetEvent _doneListening = new ManualResetEvent(false); 

。。在线程过程中

代码语言:javascript
复制
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提示,开始必须与结束配对。为了有效地取消可能正在进行的异步操作,我应该遵循不同的模式吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-29 15:16:33

如果您已经关闭/释放了EndAcceptTcpClient,则TcpClient不会阻塞。所以当你听完了,然后关闭它。它将在响应EndAcceptTcpClient时抛出一个异常,但这是可以的。您可以安全地忽略/丢弃异常。

票数 1
EN

Stack Overflow用户

发布于 2012-08-29 16:54:29

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

如果侦听器再次绑定,停止可能引发异常。因此,您可能需要检查它,或者检查IsBound (但是在检查IsBoundStop之间,您仍然可以获得一个新的绑定).

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12181139

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档