关闭后我应该手动处理插座吗?
我应该还是叫我的插座Dispose()
后关闭它?关闭后我应该手动处理插座吗?
例如:
mySocket.Shutdown(SocketShutdown.Both);
mySocket.Close();
mySocket.Dispose(); // Redundant?
我不知道,因为the MSDN documentation说以下内容:
关闭套接字连接并释放所有相关的资源。
调用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无论任何可能发生的异常。
按照惯例,你应该总是调用Dispose任何实现IDisposable。除了显而易见的事情之外,你永远不知道它可能做了什么。
如果你碰巧使用反射地看到,事实上,它目前是不需要的,你不应该假设内部实现可能在某一时刻发生变化。
它从来没有伤害调用处置。只要做到这一点:)
它不会伤害调用Dispose,但你不需要如果你'重新使用“使用”结构;它会自动完成。 “using”构造实际上编译为“try ... finally”,Dispose在“finally”中调用。 – Andy 2010-08-30 15:06:44
你是对的。我没有拼出来,但“使用结构”=调用Dispose。只要Dispose被调用。在列出的具体情况中,通常很难将“使用构造”与套接字一起使用,因为它们不是在单个方法调用中构造,使用和处理的。套接字通常比单一方法寿命更长,因此必须直接调用Dispose。 – 2010-08-30 16:17:51
关闭和处置在这种情况下是相同的。当Ms在.Net 1中引入Dispose模式时,Dispose字不易被发现。因此,准则是添加特定于上下文的关键字,这些关键字将执行相同的功能,并且更容易被用户发现。像关闭文件和套接字一样。
它通常被视为许多最佳实践关闭IDisposable的对象,因为它使代码更清晰。但是,如果您在使用语句中封装了IDisposable的用法,则显式调用Dispose会自动完成,如this page所述。
让.NET调用配置:
using (Socket mySocket = new Socket(...)) {
// Do stuff with socket, then bring it down nicely
} // Dispose gets called returning the unmanaged system resources
问题不在于使用什么,而在于调用.Close()后调用.Dispose()(不管是否显式调用Dispose)。 – 2014-02-13 22:58:53
你是对的。文档不清楚,因为在dispose方法中,应该调用Dispose()来清理套接字非托管资源,但另一方面,Close应该也这样做。我想那个关闭呼叫处置或相反。文件支持同样的行为,所以这是一个有教养的猜测。
对于某些类型的对象,'Close'可能会保留一些资源,以允许重新打开对象;对于其他类型,“Close”没有理由保留任何资源。无论哪种情况,由于在“关闭”之后调用'IDisposable.Dispose'应该没有什么坏处,这样做将确保与两种对象的兼容性。 – supercat 2014-02-10 16:37:03
thnx为dasm,但这很奇怪。 MSDN说Close()是放弃异步操作(如BeginReceive())的一种很好且合法的方法,然后EndReceive将返回“对象处置”错误。任何想法应该如何工作? – 2011-01-11 20:38:15
http://*.com/questions/4662553/how-to-abort-sockets-beginreceive/4662631#4662631 – 2011-01-11 22:35:20
你可以说关于IP不可达的问题吗? @Mark Byers https://*.com/questions/44694061/udpclient-unreachable-ip-connection-time-with-using-blocks – 2017-06-23 13:38:30