C# 如果不调用UdpClient.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("

我有下面的代码块,它会影响我的程序效率。这里的问题是,如果目标主机存在,一切都正常。但如果它确实存在,那么执行起来就太长了。最后,我发现“udp.Close()”占用了大部分执行时间。如果我不调用close方法,效率是很高的

谁能告诉我如果我不调用close方法有什么缺点??多谢各位

{ // 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
d
UdpClient
实例占用)


而且,正如我在评论中所指出的,下面这句话毫无意义:

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);