Создание сильной ссылки из Weakreference - PullRequest
1 голос
/ 22 сентября 2011

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

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 ]

0 голосов
/ 24 сентября 2011

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

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

   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;
0 голосов
/ 22 сентября 2011

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

...