作者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
→ taroa:這個… 我的宣告是擺在method外的,應該不是這個問題吧? 07/14 22:43
→ taroa:不過還是謝謝啦 :p 07/14 22:43
→ taroa:好像是要花功夫去看一看dispose的部分了… 0rz 07/14 23:08
→ FantasyRyu:有ref的沒事怎麼會被回收…沒ref的被回收也沒差了… 07/15 04:31
→ FantasyRyu:因為設隱形後基本上也叫不回來了…你要不要貼全部上來 07/15 04:31