关于异步网络连接和GC机制的问题(高手请进)

Bluclyf 2004-06-21 05:35:12
我做了个异步网络连接的程序。结构是这样的
----------------[NetKernel]--------------
| |
[NetListener] [NetClient]

NetKernel调用NetListener建立网络连接,当NetListener有请求时通过事件
SocketRequest(object sender,Socket sock)将请求的Socket发送到NetKernel类。
NetKernel再建立NetClient对象。
运行时没有什么问题。
为了增加功能我在三个类中增加了Close方法,和析构函数。然后通过System.GC.Collect();实验资源是否被释放掉。
通过反复试验,问题出现了。
<问题一>
关于异步的清除问题。
NetListener托管到OnConnectRequest方法
m_Listener.BeginAccept(new AsyncCallback(OnConnectRequest), m_Listener);
NetClient托管到OnRecievedData方法
m_Client.BeginReceive(m_byBuff,0,m_byBuff.Length,SocketFlags.None,new AsyncCallback(OnRecievedData),m_Client);
如果在Close中强制关闭。会出现问题,虽然通过Try可以屏蔽掉此错误,但始终认为此方法不好。
m_Listener.Close();
m_Client.Close();
<问题二>
强制GC
System.GC.Collect()
当程序关闭掉前面几个说明的资源后,执行强制GC。
总会发现第一次给释放掉的总是NetClient的资源,而NetListener和NetKernel的资源未被释放掉。
当再执行一次GC.Collect(),NetListener和NetKernel的资源被释放掉了。这是为什么?
NetListener与NetClient之间没有调用关系。如果说是由于NetKernel与NetClient不是一代的原因,但是NetListener与NetClient是一代的啊?

请高手指点。我实在是百思不得其解。
...全文
156 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
seekg 2004-06-23
  • 打赏
  • 举报
回复
学习
eTopFancy 2004-06-23
  • 打赏
  • 举报
回复
up
Mycro 2004-06-23
  • 打赏
  • 举报
回复
帮你定
CMIC 2004-06-23
  • 打赏
  • 举报
回复
<问题一>
在close方法中加入GC.SuppressFinalize(this);试试。
CMIC 2004-06-23
  • 打赏
  • 举报
回复
<问题一>
在close方法中加入GC.SuppressFinalize(this);试试。
Firestone2003 2004-06-23
  • 打赏
  • 举报
回复
gz
study
Bluclyf 2004-06-23
  • 打赏
  • 举报
回复
CMIC(大象) 我想关闭的是哪个异步托管。
m_Listener.BeginAccept(new AsyncCallback(OnConnectRequest), m_Listener);
怎么取消它所产生的效应?
Bluclyf 2004-06-22
  • 打赏
  • 举报
回复
关于第二个问题,我发现如果不建立NetClient实例,也需要两次强制GC,NetListener和NetKernel的资源才能被释放掉。这是为什么?那么第一次GC释放掉了什么,才能让第二次GC释放掉了剩余的资源?

110,567

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧