[英]Question about WeakReferences
我有一個關於WeakReferences的問題。
我現在正在編寫“資源管理器”,該應用程序不必保留對創建的紋理對象的引用。 我有一個像這樣的字典:
Dictionary<uint, WeakReference>
正如您可能已經猜到的那樣,第一個是資源ID,第二個參數是對資源本身的WeakReference。
現在,我的資源確實有一種從其所有者(即資源管理器)中釋放自己的方法。 他們這樣做是通過在資源管理器中調用方法,同時傳遞對此方法的引用。 如果ResMgr是他保存書簽的資源,則ResMgr會進行查找,如果是,則執行以下操作:
WeakReference result;
if (m_Resources.TryGetValue(ResourceId, out result))
{
if (result.IsAlive)
return;
(result.Target as Resource).free(); // free for good
m_Resources.Remove(ResourceId);
}
我遇到的問題是之后的部分:
if (result.IsAlive)
永遠不會到達,因為仍然有對資源的剩余引用。
問題是,我只有一個有關資源的引用,它會像這樣發布自己:
resource.free(); // calls internally its owner (i.e. ResMgr)
resource = null;
我猜剩下的引用將是“ resource”變量,但是我不能將其設置為null,因為我必須先調用free。 相當困難...
好吧,我想達到的目標是一個資源管理器,該資源管理器保留對自己擁有的資源的引用,並僅在沒有多余的引用來解決問題時才釋放它們。
知道如何以一種干凈的方式解決這個問題嗎?
PS:有沒有辦法以某種方式實際獲得參考計數?
提前致謝!
制造小鬼
我會以不同的方式處理。 我可能會在內部將WeakReference保留給該對象,但我會對其進行硬引用。 消費者不應知道從資源管理器中刪除該項目,除非他們知道他們只有該項目的引用並且不需要它。 否則,它們應僅允許系統確定何時刪除引用的對象。 這樣,只要存在對對象的(硬)引用,它將保留在內存中。 您可能將其從字典中刪除,但是您只刪除了該條目-即,即使其他使用者引用了舊對象,對它的任何新請求也都必須創建一個新對象。 如果弱引用不存在,則檢索過程應重新創建對象。
public ResourceManager<T>
{
private Dictionary<uint,WeakReference> Cache = new Dictionary<uint,WeakReference>();
public T this[uint key]
{
var obj = (T)this.Cache[key].Target;
if (obj == null)
{
obj = ...recreate resource...
this.Cache[key] = obj;
}
return obj;
}
public void Remove( uint key )
{
this.Cache.Remove(key);
}
}
如果result.IsAlive為false,則result.Target將為null。
您可能需要查看finalizer和/或ConditionalWeakTable ,它們可能會為您提供解決方案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.