关闭 TcpClient 成员的位置
本文关键字:位置 成员 TcpClient 关闭 | 更新日期: 2023-09-27 18:29:17
>上下文:我有一个实现"会话"的类,在其生命周期内保持与服务器的TCP连接。在构造函数中,我创建一个 TcpClient 实例,该实例具有要连接到的服务器的给定 IP 地址和端口。
public Session(IPAddress ipAddress)
{
Client = new TcpClient(ipAddress.ToString(), 1234); //create a client to a server which we will later use to work with
DataStream = Client.GetStream(); //get the stream for later usage
}
此会话的对象偶尔会向其关联的服务器发送和接收数据。
我现在的问题是:我应该在哪里关闭TcpClient及其底层NetworkStream?
我应该实现 IDisposable 吗?但是,如果我类的用户忘记调用 Dispose,会发生什么情况?
我应该实现析构函数(又名终结器(吗?但是 AFAIK 我永远不应该从那里访问托管资源吗?
谢谢你帮助我!
我应该实现 IDisposable 吗?
是的
但是,如果我类的用户忘记调用 Dispose,会发生什么情况?
您应该遵循此处定义的一次性模式:http://msdn.microsoft.com/en-us/library/b1yfkh5e.aspx
请参阅"我什么时候应该实现 IDisposable?
触发器是,您有一个实现IDisposable的字段(Client
(。因此,您的类应该是一次性的。
很少有类应该有清理终结器。 如果负责管理 IDisposable
实例的代码在放弃之前忽略了调用IDisposable.Dispose
,则应修复该代码。 添加终结器可能会掩盖问题,但不能解决问题,并且很可能会引入海森虫™。 此外,如果一个类负责实现IDisposable
并具有终结器的东西,则该类将需要确保调用这些事物的Dispose
方法(可能来自它自己的Dispose
方法(,但不负责从它自己的方法调用这些东西的终结器。 实际上,当类的终结器运行时,对于它所引用的任何可终结对象,通常满足以下三件事之一:
- 它已经定稿了。
- 它已经在队列中,将在当前终结器完成后不久完成。
- 对它的实时引用将存在于其他地方,并且还不应该被清理。
在任何这些情况下,终结器对对象执行的正确操作是"无"。