C# 如果不调用UdpClient.Close()方法,有什么缺点?
我有下面的代码块,它会影响我的程序效率。这里的问题是,如果目标主机存在,一切都正常。但如果它确实存在,那么执行起来就太长了。最后,我发现“udp.Close()”占用了大部分执行时间。如果我不调用close方法,效率是很高的 谁能告诉我如果我不调用close方法有什么缺点??多谢各位C# 如果不调用UdpClient.Close()方法,有什么缺点?,c#,.net,udpclient,C#,.net,Udpclient,我有下面的代码块,它会影响我的程序效率。这里的问题是,如果目标主机存在,一切都正常。但如果它确实存在,那么执行起来就太长了。最后,我发现“udp.Close()”占用了大部分执行时间。如果我不调用close方法,效率是很高的 谁能告诉我如果我不调用close方法有什么缺点??多谢各位 { // This is my code block, I need to execute it many many times. string ipAddress = Dns.GetHostAddresses("
{ // This is my code block, I need to execute it many many times.
string ipAddress = Dns.GetHostAddresses("joe-pc").FirstOrDefault().ToString();
UdpClient udp = new UdpClient(ipAddress, Port);
udp.Send(msg, msg.Length);
udp.Close();
udp = null;
}
Close()
禁用基础套接字并释放与UdpClient关联的所有托管和非托管资源。
如果未关闭,则不会禁用和释放资源(如ur端口和IP地址),缺点是会导致资源泄漏。您可能很幸运,垃圾收集经常发生,以至于它没有在您的程序中显示出来,但是为什么要冒险呢?从以下文件: 关闭将禁用基础资源,并释放与相关联的所有托管和非托管资源 注意,它谈到了非托管资源。只有运行某些代码的
UdpClient
才会释放这些代码-它要么在Close
/Dispose
中释放这些代码,要么必须在其Finalize
方法中释放这些代码-其他任何操作都不会导致释放这些代码(假设程序保持运行)
通过使用Task.Run
将Close
操作的成本隐藏在另一个线程上,但您必须权衡这样做的成本
或者,更具体地说,你说你需要这个方法运行很多次。如果不清理此处的资源,则会增加后续调用完全失败的可能性,因为它无法获取所需的资源(它们都被现有的非
Close
dUdpClient
实例占用)
而且,正如我在评论中所指出的,下面这句话毫无意义:
udp = null;
这种代码过去在COM时代的VB中很有用,但是它在.NET世界中没有一席之地。您是否可以使用
BeginSend
而不是使用Send,然后在您尝试关闭时在回调中处理异常,如果这确实是问题所在?您的目标可能是joe pc,随着dns记录的更改,其ip地址不同,但每次发送时都会重复使用相同的UdpClient。做完后记得把它关上
使用
也跳过dns查找。我知道这是一段时间,但今天我无意中发现了这个问题,想补充一下:
udp=null
不是毫无意义的imho。在某些情况下,您可以在内存分析器中看到,如果不将实例设置为null,则实例仍然可用 旁注-为什么之后要将其设置为null
?根据我的个人经验,需要将udp=null;在udp.Close()之后的末尾。我使用内存探查器(dotmemory)检查了保留的实例,发现UdpClient实例仍然保留,除非udp=null;我也注意到了。udp.Close()未从堆中删除实例。需要添加udp=null;在udp.Close()之后删除实例。
//
// Summary:
// Sends a UDP datagram to a specified port on a specified remote host.
//
// Parameters:
// dgram:
// An array of type System.Byte that specifies the UDP datagram that you intend
// to send represented as an array of bytes.
//
// bytes:
// The number of bytes in the datagram.
//
// hostname:
// The name of the remote host to which you intend to send the datagram.
//
// port:
// The remote port number with which you intend to communicate.
//
// Returns:
// The number of bytes sent.
//
public int Send(byte[] dgram, int bytes, string hostname, int port);