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

Kev*_*vin 32 c# sockets dispose

关闭我还应该打电话Dispose()给我的插座吗?

例如:

mySocket.Shutdown(SocketShutdown.Both);
mySocket.Close();
mySocket.Dispose(); // Redundant?
Run Code Online (Sandbox Code Playgroud)

我想知道因为MSDN文档说明如下:

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

Mar*_*ers 40

在内部调用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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • Thnx为dasm,但这很奇怪.MSDN说,Close()是中止异步操作(如BeginReceive())的一种好的合法方式,然后EndReceive将返回"对象处置"错误.任何想法它应该如何工作? (2认同)

Ale*_*ort 21

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

  • + 1酷历史课:). (4认同)
  • 相关MSDN博文:【Close和Dispose的区别】(https://blogs.msdn.microsoft.com/kimhamil/2008/03/15/the-often-non-difference-between-close-and-dispose/ )。 (2认同)

Erv*_*ter 6

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

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

调用Dispose永远不会伤害.去做就对了 :)

  • 你是对的.我没有说出来,但"使用构造"=调用Dispose.只要调用Dispose.在列出的特定情况下,通常很难将"using构造"与套接字一起使用,因为它们不是在单个方法调用中构造,使用和处理的.套接字通常比单个方法寿命更长,因此必须直接调用Dispose. (3认同)