簡體   English   中英

關於弱引用的問題

[英]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:有沒有辦法以某種方式實際獲得參考計數?

提前致謝!

制造小鬼

我建議您研究緩存或參考計數。 弱引用從未被用作緩存系統。
.NET中沒有“引用計數”。 引用對象或不引用對象。 如果您需要實際的引用計數,那么我建議您從Rx庫的 RefCountDisposable構建,該是引用計數的IDisposable

我會以不同的方式處理。 我可能會在內部將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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM