Создание сильной ссылки из Weakreference

Ниже приведен пример кода нашего приложения, в котором мы пытаемся сохранить слабую ссылку на огромный объект модели страницы, который занимает много памяти.

Dictionary<int,WeakReference> modelCache;

IPageModel ReadPageModel()
{
   IPageModel page;
   if (!modelCache.ContainsKey(cacheKey) || !modelCache[cacheKey].IsAlive)
   {
      model = new PageModel();
      modelCache[cacheKey] = new WeakReference(Model);                
   }
   else
   {
      model = modelCache[cacheKey].Target as IPageModel;
   }
   return model;
}

Модель, которую мы возвращаем (в другой части), является ссылкой на слабый объект, поэтому в более позднее время она может быть нулевой.

Есть ли способ, чтобы мы могли создать сильную ссылку на этот объект, и позже, когда мы закончили с объектом, мы можем сделать его слабой ссылкой.

Я сталкивался с некоторыми примерами, когда слабые ссылки преобразуются в сильные, а не наоборот.

2 ответа

Решение

Java gc объекты со слабой ссылкой только тогда, когда они ТОЛЬКО являются слабыми ссылками. Таким образом, до тех пор, пока у вас есть нормальная ссылка на объект, java не получит его и вы не получите нулевую ссылку.

Спасибо, Ксено Лупус,

Таким образом, ссылка была сильной ссылкой, но прежде, чем я поместил объект значения, он был собран. Теперь я изменил код следующим образом:

   IPageModel page;
   if (modelCache.ContainsKey(cacheKey) && modelCache[cacheKey].IsAlive)
   {
      model = modelCache[cacheKey].Target as IPageModel;                         
   }
   if(model == null)
   {
      model = new PageModel();
      modelCache[cacheKey] = new WeakReference(Model); 
   }
   return model;
Другие вопросы по тегам