2008-11-22 3 views
72

Может ли кто-нибудь объяснить основные преимущества различных типов ссылок в C#?Слабые справочные преимущества

  • Слабые ссылки
  • Мягкие ссылки
  • Фантомные ссылки
  • Сильные ссылки.

У нас есть приложение, которое потребляет много памяти, и мы пытаемся определить, является ли это областью для фокусировки.

+0

Используется ли в вашем приложении класс System.WeakReference? – MusiGenesis 2008-11-22 01:41:50

ответ

61

Мягкие и фантомные ссылки приходят с Java, я верю. Длинная слабая ссылка (передается true для конструктора WeakReference C#) может считаться аналогичной Java PhantomReference. Если в C# есть аналог SoftReference, я не знаю, что это такое.

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

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

+3

См. Также: [Слабые ссылки (MSDN)] (http://msdn.microsoft.com/en-us/library/ms404247.aspx) – 2012-01-04 16:43:54

35

MSDN имеет хорошее объяснение weak references. Ключ цитата находится в нижней части, где он говорит:

Избегайте использование слабых ссылок в качестве автоматического решения памяти проблемы управления. Вместо этого разработайте эффективную политику кэширования для , обрабатывающей объекты вашего приложения.

Каждый раз, когда я видел WeakReference в дикой природе, он использовался как автоматическое решение проблем управления памятью. Вероятно, есть лучшие решения проблем вашего приложения.

+2

Я нашел эту цитату запутанной, потому что кажется, что любое использование слабых ссылок может обрабатываться приложением. В примере, который использует документация, TreeView, приложение может отслеживать, использовал ли пользователь TreeView в течение определенного периода времени, а если нет, установите значение TreeView равным null, позволяя сборщику мусора иметь на нем. Это выполнит ту же задачу, но из приложения. – 2012-06-05 18:46:53

4

Блестящий реальный пример с WeakReference объясняется в Android development tutorial.

На изображении (ImageView) есть изображение (растровое изображение) и контейнер изображений. Если изображение будет загружено не из памяти (но, например, с диска, сети), тогда оно может заблокировать поток пользовательского интерфейса и экран. Чтобы избежать этого, можно использовать асинхронную задачу.

Проблема возникает, когда задача async завершается. Контейнер с изображениями может быть непригодным вообще в это время (экран изменен или Android выгружает невидимую часть просмотра после прокрутки). WeakReference может помочь здесь, и ImageView будет собирать мусор.

class BitmapWorkerTask extends AsyncTask<Integer, Void, Bitmap> { 
    private final WeakReference<ImageView> imageViewReference; 

    public BitmapWorkerTask(ImageView imageView) { 
     imageViewReference = new WeakReference<ImageView>(imageView); 
    } 
    // Method for getting bitmap is removed for code clearness 

    // Once complete, see if ImageView is still around and set bitmap. 
    @Override 
    protected void onPostExecute(Bitmap bitmap) { 
     if (imageViewReference != null && bitmap != null) { 
      final ImageView imageView = imageViewReference.get(); 
      if (imageView != null) { 
       imageView.setImageBitmap(bitmap); 
      } 
     } 
    } 
} 

P.S. пример находится в Java, но может быть понят разработчиками C#.
http://developersdev.blogspot.ru/2014/01/weakreference-example.html

Смежные вопросы