关闭后,我应该手动处理插座吗?

时间:2010-08-30 14:55:07

标签: c# sockets dispose

关闭后,我仍然可以在我的套接字上拨打Dispose()吗?

例如:

mySocket.Shutdown(SocketShutdown.Both);
mySocket.Close();
mySocket.Dispose(); // Redundant?

我很想知道因为the MSDN documentation说了以下内容:

  

关闭Socket连接并释放所有相关资源。

6 个答案:

答案 0 :(得分:38)

在内部调用Close会调用Dispose,因此您无需同时调用它们。来自.NET Reflector

public void Close()
{
    if (s_LoggingEnabled)
    {
        Logging.Enter(Logging.Sockets, this, "Close", (string) null);
    }
    ((IDisposable)this).Dispose();
    if (s_LoggingEnabled)
    {
        Logging.Exit(Logging.Sockets, this, "Close", (string) null);
    }
}

如果可能,您应该使用using模式,以便始终调用Dispose,而不管可能发生的任何异常。

答案 1 :(得分:21)

在这种情况下,

关闭和处理是相同的。当Ms在.Net 1中引入Dispose模式时,Dispose字不是很容易被发现。因此,指南是添加特定于上下文的关键字,这些关键字将执行相同的功能,并且将更容易被用户发现。像关闭文件和套接字一样。

答案 2 :(得分:6)

按照惯例,您应该始终在实现IDisposable的任何内容上调用Dispose。除了显而易见的事情,你永远都不知道它可能会做些什么。

如果您碰巧使用Reflector看到它,实际上,目前不需要它,您不应该假设内部实现可能会在某些时候发生变化。

调用Dispose永远不会伤害。就这样做:)

答案 3 :(得分:2)

许多人通常认为关闭IDisposable对象是最佳做法,因为它使代码更清晰。但是,如果您将使用IDisposable的用法封装在using语句中,则显式调用Dispose会自动完成,如this page所述。

答案 4 :(得分:0)

让.NET调用dispose:

using ( Socket mySocket = new Socket( ... ) ) {
  // Do stuff with socket, then bring it down nicely
}  // Dispose gets called returning the unmanaged system resources

答案 5 :(得分:0)

你是对的。文档不明确,因为在dispose方法中写入了你应该调用Dispose()来清理套接字非托管资源,但另一方面,Close应该这样做。我想Close会调用Dispose或相反。文件支持相同的行为,因此这是一种有根据的猜测。