Schwache Referenzvorteile


73

Kann jemand die Hauptvorteile verschiedener Arten von Referenzen in C # erklären?

  • Schwache Referenzen
  • Weiche Referenzen
  • Phantomreferenzen
  • Starke Referenzen.

Wir haben eine Anwendung, die viel Speicher verbraucht, und wir versuchen festzustellen, ob dies ein Bereich ist, auf den wir uns konzentrieren müssen.


Verwendet Ihre Anwendung speziell die Klasse System.WeakReference?
MusiGenesis

Antworten:


61

Ich glaube, Soft- und Phantomreferenzen stammen aus Java. Eine lange schwache Referenz (die dem WeakReference-Konstruktor von C # entspricht) kann als ähnlich wie die PhantomReference von Java angesehen werden. Wenn es in C # ein Analogon zu SoftReference gibt, weiß ich nicht, was es ist.

Schwache Referenzen verlängern nicht die Lebensdauer eines Objekts und ermöglichen so die Müllabfuhr, sobald alle starken Referenzen den Gültigkeitsbereich überschritten haben. Sie können nützlich sein, um an großen Objekten festzuhalten, deren Initialisierung teuer ist, die jedoch für die Speicherbereinigung verfügbar sein sollten, wenn sie nicht aktiv verwendet werden.

Ob dies zur Reduzierung des Speicherverbrauchs Ihrer Anwendung hilfreich ist oder nicht, hängt vollständig von den Besonderheiten der Anwendung ab. Wenn beispielsweise eine moderate Anzahl von zwischengespeicherten Objekten herumhängt, die möglicherweise in Zukunft wiederverwendet werden oder nicht, können schwache Referenzen dazu beitragen, den Speicherverbrauch der Caches zu verbessern. Wenn die App jedoch mit einer sehr großen Anzahl kleiner Objekte arbeitet, verschlimmern schwache Referenzen das Problem, da die Referenzobjekte mindestens so viel Speicherplatz beanspruchen.



35

MSDN hat eine gute Erklärung für schwache Referenzen . Das Schlüsselzitat befindet sich unten, wo es heißt:

Vermeiden Sie schwache Referenzen als automatische Lösung für Speicher - Management - Probleme . Entwickeln Sie stattdessen eine effektive Caching-Richtlinie für die Behandlung der Objekte Ihrer Anwendung.

Jedes Mal, wenn ich eine WeakReference in freier Wildbahn gesehen habe, wurde sie als automatische Lösung für Speicherverwaltungsprobleme verwendet. Es gibt wahrscheinlich bessere Lösungen für die Probleme Ihrer Anwendung.


2
Ich fand dieses Zitat verwirrend, weil es so aussieht, als ob jede Verwendung schwacher Referenzen von der Anwendung behandelt werden könnte. In dem in der Dokumentation verwendeten Beispiel einer TreeView könnte die Anwendung überwachen, ob der Benutzer die TreeView für einen bestimmten Zeitraum verwendet hat, und, falls nicht, die TreeView auf null setzen, damit der Garbage Collector darauf zugreifen kann. Das würde die gleiche Aufgabe erfüllen, aber aus der Anwendung.
Carl G

2
@DGGenuine: Ich persönlich sehe überhaupt keine Verwendung für schwache Referenzen. Ich bin ihnen einige Male in Projekten begegnet, die ich von anderen Entwicklern geerbt habe, und in jedem Fall musste ich sie vollständig entfernen, da die ursprünglichen Entwickler nicht verstanden haben, was sie sind und wofür sie bestimmt sind.
MusiGenesis

10
@MusiGenesis :: I see no use at all for weak referencesBis Sie einen Speicherverlust in Ihrer GC-fähigen Laufzeit haben, weil irgendwo im Code ein Verweis auf einen Baumknoten vorhanden ist, der den gesamten Baum referenziert und somit keinen Müll sammelt, obwohl er nicht mehr verwendet wird . Die WeakReference wird als schwache Referenz verwendet (Wortspiel beabsichtigt): " Wenn das Objekt noch verwendet wird, möchte ich in der Lage sein, etwas damit zu tun, aber wenn es nicht mehr vorhanden ist, möchte ich keinesfalls das sein." eine, um es am Leben zu erhalten. "Es ist Code-Hygiene, die das Eigentum oder Nicht-Eigentum an einem Objekt bestimmt.
Paercebal

9
@paercebal: Sie scheinen zu sagen, dass eine gültige Verwendung für schwache Referenzen als Hack / Workaround für einen Fehler an einer anderen Stelle in Ihrem Code dient. Ich nehme an, Sie könnten dieses Argument vorbringen.
MusiGenesis

6
Ereignisse sollten immer schwache Referenzen sein ... aber leider sind sie nicht standardmäßig. MS hat eine Klasse , die Ereignisse mit schwachen Referenzen behandelt, aber leider ist ihre Syntax grausam. Aber zum Glück gibt es eine Ereignisbibliothek , die eine einfache Syntax für schwache Ereignisse sowie einige andere Verbesserungen an Ereignissen bietet (z. B. einfach mehrere Veröffentlichungen für dasselbe Ereignis zu haben, unnötige Kopplungen zu entfernen usw.)
BlueRaja - Danny Pflughoeft

5

Ein brillantes Beispiel mit WeakReference wird im Android-Entwicklungs-Tutorial erklärt .

In der Ansicht (ImageView) befinden sich ein Bild (Bitmap) und ein Bildcontainer. Wenn das Bild nicht aus dem Speicher (sondern z. B. von der Festplatte, dem Netz) geladen wird, kann es den UI-Thread und den Bildschirm sperren. Um dies zu vermeiden, kann eine asynchrone Aufgabe verwendet werden.

Das Problem tritt auf, wenn die asynchrone Aufgabe beendet ist. Der Bildcontainer kann zu diesem Zeitpunkt überhaupt nicht nützlich sein (Bildschirm wird geändert oder Android entlädt nach dem Scrollen den unsichtbaren Ansichtsteil). WeakReference kann hier helfen und ImageView wird Müll gesammelt.

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);
            }
        }
    }
}

PS Das Beispiel ist in Java, kann aber von C # -Entwicklern verstanden werden.
Quelle: http://developersdev.blogspot.ru/2014/01/weakreference-example.html

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.