关于异步网络连接和GC机制的问题(高手请进)
我做了个异步网络连接的程序。结构是这样的
----------------[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是一代的啊?
请高手指点。我实在是百思不得其解。