我有以下代码块,它会影响我的程序效率。这里的问题是如果目标主机存在,一切正常。但如果确实存在,执行时间太长。最后,我发现“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;
}
答案 0 :(得分:2)
缺点是你会有资源泄漏。你可能足够幸运,垃圾收集经常发生,它不能在你的程序中展示自己,但为什么要冒这个机会呢?来自Close
的文档:
请注意,它讨论了非托管资源。运行某些代码的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,则您的实例仍然可用。