73 votes

Références faibles

est-ce que quelqu'un peut expliquer les principaux avantages des différents types de références en c#, références faibles, douces références, références fantômes, références fortes.

Nous avons une application qui consomme beaucoup de mémoire et nous essayons de déterminer si c’est un domaine de se concentrer sur.

61voto

Scott Pedersen Points 1050

Doux fantôme et les références viennent de Java, je crois. Une longue référence faible (pass vrai pour C#'s WeakReference constructeur) peut être considéré comme similaire à Java PhantomReference. Si il est un analogue de SoftReference en C#, je ne sais pas ce que c'est.

Références faibles ne permettent pas de prolonger la durée de vie d'un objet, lui permettant ainsi d'être nettoyée une fois que toutes les références ont disparu hors de portée. Ils peuvent être utiles pour la tenue sur les grands objets qui sont chers à l'initialiser, mais doit être disponible pour garabage collection si elles ne sont pas activement utilisés.

Si oui ou non ce sera utile dans la réduction de la consommation de mémoire de votre application dépendra entièrement sur les particularités de la demande. Par exemple, si vous avez un nombre modéré de mise en cache des objets suspendus autour de qui peut ou ne peut pas être réutilisé dans le futur, la faiblesse des références pourrait aider à améliorer la consommation de mémoire des caches. Toutefois, si l'application fonctionne avec un verly grand nombre de petits objets, de la faiblesse des références fera qu'aggraver le problème, puisque les objets de référence prendra autant ou plus de mémoire.

35voto

MusiGenesis Points 49273

MSDN a une bonne explication de la faiblesse des références. La clé de la citation est à la base où il est dit:

Évitez d'utiliser des références faibles comme solution automatique de la mémoire les problèmes de gestion. Au lieu de cela, développer une efficace stratégie de mise en cache pour la manipulation de vos objets d'application.

Chaque fois que j'ai vu un WeakReference dans la nature, il a été utilisé comme une solution automatique de problèmes de gestion de mémoire. Il y a probablement de meilleures solutions à vos problèmes.

5voto

Artru Points 737

Brillant exemple réel avec WeakReference est expliqué dans le développement Android tutoriel.

Il y a une image (Bitmap) et l'image du conteneur sur la vue (ImageView). Si l'image sera chargé, à partir de la mémoire (disque, net), alors il peut verrouiller thread de l'INTERFACE utilisateur et l'écran. Pour l'éviter async tâche peut être utilisé. Le problème se pose quand async tâche est terminée. Image conteneur peut ne pas être utile à tous, à l'époque (l'écran est changé ou Android décharge invisible vue de la partie après le défilement). WeakReference peut aider à entendre et ImageView sera nettoyée.

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. l'exemple est en Java, mais peut être compris par les développeurs C#.
Source: http://developersdev.blogspot.ru/2014/01/weakreference-example.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X