我正在研究异步C#套接字,我注意到了一些我很困惑的事情。
在所有结束...(接受/连接)等中,有一个代码部分,如:
Socket s = (Socket) ar.AsyncState;
这里它是一个插座。
当每个End使用这些本地套接字时,在完成后尝试close()
任何一个都有任何意义吗?
最佳做法是什么?
答案 0 :(得分:4)
大多数作者似乎都同意,如果某些东西实现了IDisposable,你应该调用Dispose。最简单的方法是使用“using”自动为您调用Dispose。
using (DirectoryEntry de = new DirectoryEntry(path))
{
.... some code
}
答案 1 :(得分:2)
我认为套接字的最佳做法与流类似。我个人总是在套接字和流中使用close()方法。如果打开了某些东西,应该正确关闭它:)
答案 2 :(得分:1)
即使你没有(当垃圾收集器启动时)它也会最终关闭,但是最佳实践要求你在不再需要它时关闭对象的句柄。
考虑文件流,而不是关闭文件流可能意味着数据不会写入文件。如果你没有明确地关闭应该关闭的对象的句柄,就会出现这样的问题。
答案 3 :(得分:1)
关闭插座至关重要。仅仅因为您没有注意到特定框架版本中的任何不良影响并不意味着在将来的实现中,框架可能会在资源关闭之前使用资源。您最有可能在系统上留下资源。另外,它没有伤害。 :P
该对象可能释放其资源并在销毁时隐含地关闭套接字,但是使用像C#这样的自动垃圾收集环境,您永远不知道何时可能发生这种情况。
答案 4 :(得分:1)
使用
using(Socket s)
{
...
}
或使用套接字打开并在最后关闭套接字。
如果您打开套接字并尝试在其他地方再次打开它,则会发生运行时错误... 必须关闭所有流数据读取器,连接。 主要原因似乎是: 安全 浪费记忆力 3.容易出现运行时错误
答案 5 :(得分:1)
我建议您在完成后暂停或关闭流。这样,一旦完成套接字,系统就可以立即释放网络资源。
如果从单个函数使用套接字,则using
语句可以正常工作,因为它隐式处理您的对象。否则(例如,当保持套接字处于活动状态时,在对象中保持对它的引用),您将需要在完成后调用Close()
或Dispose()
。否则,套接字可以无限期保持打开状态。 Dispose()
可能是一个更好的选择,因为它可以释放比Close()
更多的资源。
MSDN可能会跳过Close
,因为当剩余资源被垃圾回收时,套接字将在进程终止时自动关闭。
答案 6 :(得分:0)
Socket.Close调用Dispose。在IDisposable对象上显式或隐式调用Dispose是强制性的。 IDisposable接口适用于使用非托管资源的对象,因此允许在不调用dispose的情况下对对象进行垃圾回收将导致资源泄漏。一个简短的示例程序可能不会显示这个问题,但是一个完整的,长时间运行的问题肯定会遇到问题。