Słabe korzyści referencyjne

Czy ktoś może wyjaśnić główne zalety różnych typów odwołań w C#?

  • Słabe referencje
  • miękkie referencje
  • Phantom references
  • Mocne referencje.

Mamy aplikację, która pochłania dużo pamięci i staramy się ustalić, czy jest to obszar, na którym należy się skupić.

Author: Nikolai Samteladze, 2008-11-22

3 answers

Soft i phantom nawiązania pochodzą z Javy, jak sądzę. Długie słabe odniesienie (pass true to C#'S weakreference constructor) może być uważane za podobne do Phantomreference w Javie. Jeśli w C# jest analogia do SoftReference, to nie wiem co to jest.

Słabe odniesienia nie wydłużają żywotności obiektu, pozwalając tym samym na zbieranie śmieci, gdy wszystkie silne odniesienia wyjdą poza zakres. Mogą być przydatne do trzymania dużych przedmiotów, które są drogie do initialize, ale powinny być dostępne do zbierania śmieci, jeśli nie są aktywnie używane.

To, czy będzie to przydatne w zmniejszaniu zużycia pamięci aplikacji, zależy całkowicie od specyfiki aplikacji. Na przykład, jeśli masz umiarkowaną liczbę buforowanych obiektów, które mogą lub nie mogą być ponownie użyte w przyszłości, słabe odwołania mogą pomóc poprawić zużycie pamięci pamięci podręcznej. Jeśli jednak aplikacja działa z bardzo duża liczba małych obiektów, słabe referencje pogorszą problem, ponieważ obiekty referencyjne zajmą tyle lub więcej pamięci.

 61
Author: Scott Pedersen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-16 04:32:13

MSDN ma dobre wyjaśnienie słabych odniesień . Kluczowy cytat znajduje się na dole, gdzie jest napisane:

Unikaj używania słabych odniesień jako automatyczne rozwiązanie pamięci problemy z zarządzaniem . Zamiast tego rozwijaj skuteczna polityka buforowania dla obsługa obiektów aplikacji.

Za każdym razem, gdy widziałem słabą referencję na wolności, była używana jako automatyczne rozwiązanie problemów z zarządzaniem pamięcią. Są prawdopodobnie lepsze rozwiązania problemów aplikacji.

 35
Author: MusiGenesis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-22 02:31:20

Genialny prawdziwy przykład z WeakReference jest wyjaśniony w Android development tutorial .

W widoku znajduje się obraz (bitmapa) i kontener obrazu (ImageView). Jeżeli obraz będzie ładowany nie z pamięci (ale np. z dysku, sieci) to może zablokować wątek interfejsu i ekran. Aby tego uniknąć, można użyć zadania asynchronicznego.

Problem pojawia się po zakończeniu zadania asynchronicznego. Kontener obrazu może nie być użyteczny w ogóle w tym czasie (ekran jest zmieniony lub Android rozładowuje niewidoczne widok części po przewinięciu). WeakReference może tu pomóc, a ImageView będzie zbierana.

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. przykład jest w Javie, ale może być zrozumiany przez programistów C#.
Źródło: http://developersdev.blogspot.ru/2014/01/weakreference-example.html

 5
Author: Artru,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-05 17:10:57