如果我不调用UdpClient.Close()方法有什么缺点?

时间:2012-10-08 06:44:27

标签: c# .net udpclient

我有以下代码块,它会影响我的程序效率。这里的问题是如果目标主机存在,一切正常。但如果确实存在,执行时间太长。最后,我发现“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;
}

5 个答案:

答案 0 :(得分:2)

缺点是你会有资源泄漏。你可能足够幸运,垃圾收集经常发生,它不能在你的程序中展示自己,但为什么要冒这个机会呢?来自Close的文档:

  

关闭会停用基础Socket并释放与UdpClient关联的所有托管和非托管资源。

请注意,它讨论了非托管资源。运行某些代码的UdpClient会释放 - 它会在Close / Dispose中执行,或者必须在其Finalize中执行1}}方法 - 没有其他任何东西会导致它们被释放(假设程序保持运行)。

可能能够隐藏Close操作的费用,方法是使用Task.Run让它在另一个线程上运行 - 但你必须权衡这样做的成本。


或者,更具体地说 - 你说你需要这种方法多次运行。通过不清理您的资源,您将增加后续调用完全失败的可能性,因为它无法获取所需的资源(它们全部被绑定在现有的,非{{1} } d Close个实例)。


而且,正如我的评论所示,以下几行毫无意义:

UdpClient

此类代码曾经在COM时代VB中使用过,但它在.NET世界中没有地位。

答案 1 :(得分:0)

Close()禁用基础Socket并释放与UdpClient关联的所有托管和非托管资源。 如果你没有关闭,那么它不会禁用&释放资源,如你的端口和放大器IPADDRESS

答案 2 :(得分:0)

您可以使用Send而不是使用BeginSend,然后在您的回调中处理异常,当您尝试关闭时,如果这实际上是问题吗?

答案 3 :(得分:0)

当你的dns记录发生变化时,你可能会使用不同的ip地址来定位joe-pc,但你会为每次发送重复使用相同的UdpClient。只要记得在你完成之后关闭()它。

使用

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

并跳过dns查找。

答案 4 :(得分:0)

我知道这已经有一段时间了,但今天我偶然发现了这个问题,并希望补充一下:

UDP = NULL;

并非毫无意义的imho。在某些情况下,您可以在内存分析器中看到,如果您未将其设置为null,则您的实例仍然可用。