作者cole945 (躂躂..)
看板Visual_Basic
标题Re: [.NET] 请问一下如何知道物件已被GC回收?
时间Sat Jul 14 04:00:41 2007
※ 引述《taroa (未来主义猪)》之铭言:
: 因为在用MDI时,子Frame如果visible从true改成flase
: 有些时候子Frame会被GC回收掉… 0rz
问题症结在於你的架构设计有点问题, 而不是因为visible被改成flase所致..
会被GC回收, 那是因为该object(也就是你的MDI子Frame)不再被参考到,
你的程式可能是写成像
Sub CreateFrame()
Dim 子Frame as Frame
子Frame = new Frame
' .....
End Sub
因为 MDI子Frame 只被 "子Frame" 参考到, 而一但离开 CreateFrame,
该MDI子Frame 就无法再用任何方式存取他, 所以才会被 GC 选中回收..
在你的parent form上应该要利用一个像 List 的资料结构来记录(追踪)你所建出的
frame, 这样不只能确保frame不会被gc回收, 更重要的是, 你可以做一些後续的
管理工作 (不然你要怎麽把hiden的frame再show出来?)
(若在 VB2005 还有 Generic Collection 更好用..)
一个简单的雏型如下
Public Frames As New System.Collections.Generic.List(Of Frame)
Sub CreateFrame()
Dim 子Frame as Frame
子Frame = new Frame
Frames.Add( 子Frame )
'.....
End Sub
: 目前我用的方式是很蠢的,如以下,请问有没有正确的作法啊 多谢……
: if 子Frame is nothing then
: 子Frame = new frame
: end if
: if 子Frame.created = false then
: 子Frame = new frame
: end if
这个问题有点吊诡..
基本上, 在 .NET程式执行中, 应该是无法判断本身某个物件是否被回收..
若你还能参考到该物件, 该物件就不该被回收..
子Frame是nothing 也并不代表他已经被回收..
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.139.185.247
1F:→ taroa:这个… 我的宣告是摆在method外的,应该不是这个问题吧? 07/14 22:43
2F:→ taroa:不过还是谢谢啦 :p 07/14 22:43
3F:→ taroa:好像是要花功夫去看一看dispose的部分了… 0rz 07/14 23:08
4F:→ FantasyRyu:有ref的没事怎麽会被回收…没ref的被回收也没差了… 07/15 04:31
5F:→ FantasyRyu:因为设隐形後基本上也叫不回来了…你要不要贴全部上来 07/15 04:31