是否应该处置 UdpClient?

Posted

技术标签:

【中文标题】是否应该处置 UdpClient?【英文标题】:Should a UdpClient be disposed of? 【发布时间】:2014-08-10 07:49:19 【问题描述】:

在尝试处理 UdpClient 时,我发现这是不可能的。对于以下内容:

UdpClient udpClient = new UdpClient();
udpClient.Dispose();

Visual Studio 显示错误:

'System.Net.Sockets.UdpClient.Dispose(bool)' 由于以下原因无法访问 其防护等级

这是否意味着我应该从UdpClient 继承并公开Dispose(因为whatever implements IDisposable should be disposed of 似乎是共识)?有什么理由我们不应该直接使用这个类吗?还是在调用Close 之后就没有什么可处理的了?

虽然using 声明确实有效 - 不适合在聆听时使用。

【问题讨论】:

如果你应该从它继承,构造函数也会受到保护,但它们是公共的。 The documentation 绝对是误导。 protected virtual void UdpClient.Dispose(Boolean) 自 .NET 框架 2.0 以来一直存在,而无参数重载 public void Dispose() 仅在 4.6 之后可用。您的项目针对的是 【参考方案1】:

不,你不应该。 你应该打电话给UdpClient.Close ...


在这里查看源码后:http://referencesource.microsoft.com/#System/net/System/Net/Sockets/UDPClient.cs#7682e0ea2c48b5cb

看来您可以调用Close((IDisposable)updClient).Dispose,但在API 方面我认为调用Close 是UDP 客户端的使用方式...

这一切对我来说意义不大......

【讨论】:

既然大家一致认为whatever implements IDisposable should be disposed of - 你有消息来源吗? 此 API 支持 .NET Framework 基础结构,不能直接从您的代码中使用。 msdn.microsoft.com/en-us/library/bb360027.aspx @ispiro 这基本上是 .Net 1.1 的设计缺陷 +1 谢谢。这是一个非常明确的来源!虽然,我承认我现在不理解整个UdpClient.IDisposable.Dispose 的事情,为什么the documentation for UdpClient.Dispose 没有提到这一点。也许这里有两个单独的 Dispose 方法......无论如何 - 感谢您的回答。 @ispiro 看着source 我不明白。 “UdpClient.Close”与“UdpClient.IDisposable.Dispose”相同

以上是关于是否应该处置 UdpClient?的主要内容,如果未能解决你的问题,请参考以下文章

无法访问已处置的对象。对象名称:'System.Net.Sockets.UdpClient'

如何在循环中使用 UdpClient.BeginReceive

重用 UdpClient 与处置它

我应该处置互斥锁吗?

UdpClient 与 TcpClient

UdpClient端口被重复占用错误