6 votes

Équivalent de SoftReference en .net ?

Je connais WeakReference mais je cherche un type de référence qui soit effacé. sólo lorsque la mémoire est faible, et non pas simplement à chaque fois que le gc s'exécute (tout comme le gc de Java). SoftReference ). Je cherche un moyen d'implémenter un cache sensible à la mémoire.

3voto

stevemegson Points 6741

Le cache ASP.NET vous donne le comportement sensible à la mémoire que vous souhaitez, avec l'inconvénient que tout doit avoir une clé unique. Toutefois, vous devriez être en mesure de conserver une référence faible à un objet que vous avez placé dans le cache d'ASP.NET. La référence forte du cache tiendra la GC à distance jusqu'à ce que le cache décide qu'il doit être récupéré pour libérer de la mémoire. La WeakReference vous permet d'accéder à l'objet sans avoir à consulter la clé du cache.

Foo cachedData = new Foo();
WeakReference weakRef = new WeakReference( cachedData );
HttpRuntime.Cache[Guid.NewGuid().ToString()] = cachedData;

...

if ( weakRef.IsAlive )
{
    Foo strongRef = weakRef.Target as Foo;
}

Vous pourriez créer une classe SoftReference en étendant WeakReference selon le modèle suivant

class SoftReference : WeakReference
{
    public SoftReference( object target ) : base( target )
    {
        HttpRuntime.Cache[Guid.NewGuid().ToString()] = target; 
    }
}

Vous devrez également remplacer le paramètre setter sur Target pour vous assurer que toute nouvelle cible est placée dans le cache.

2voto

M4N Points 48758

Peut-être que la classe ASP.NET Cache ( System.Web.Caching.Cache ) pourrait vous aider à obtenir ce que vous voulez ? Il supprime automatiquement les objets si la mémoire devient faible :

Voici un article qui montre comment utiliser la classe Cache dans une application Windows forms.

2voto

Rob Windsor Points 5009

En plus du cache ASP.NET, il existe le bloc d'application de mise en cache du groupe Microsoft Patterns and Practices.

http://msdn.microsoft.com/en-us/library/cc309502.aspx

1voto

supercat Points 25534

Bien qu'un SoftReference peut sembler être un moyen pratique d'implémenter la mise en cache de la mémoire, il exige que le runtime Java détermine de manière quelque peu arbitraire si l'avantage de conserver un objet dépasse le coût de son stockage. Malheureusement, le runtime ne dispose que d'informations limitées sur le coût réel de la conservation d'un objet (sachant que le coût réel peut inclure l'impact de l'utilisation de la mémoire d'une application sur d'autres applications), et pratiquement aucune information sur l'avantage de conserver l'objet.

S'il vaut la peine de conserver un objet même s'il n'existe aucune référence forte extérieure à cet objet, un cache devrait conserver une référence forte à cet objet (au moins aussi longtemps que cela semble utile). Si l'avantage de garder l'objet dans le cache ne dure que tant qu'une référence extérieure existe (par exemple, parce que la production d'instances est bon marché, mais que le fait que deux entités logiques qui contiennent des données identiques utilisent la même instance pour les contenir faciliterait les comparaisons entre ces entités), on devrait utiliser une référence forte à l'objet. WeakReference .

Par ailleurs, si j'avais le choix, .net prendrait en charge un autre type de référence que je n'ai jamais vu sur aucune plate-forme : une référence "intéressant quelqu'un d'autre", qui serait utilisée en conjonction avec un type de référence de type WeakReference . Une référence "d'intérêt pour quelqu'un d'autre" pourrait être utilisée comme une référence forte, mais une référence de type WeakReference serait invalidée si les seules références fortes à sa cible étaient "d'intérêt pour quelqu'un d'autre". Un tel concept pourrait améliorer l'efficacité lors de l'utilisation d'un GC concurrent, dans les cas où un gestionnaire d'événement faible génère de manière répétée une référence forte à sa cible. Si personne n'est vraiment intéressé par ce que le gestionnaire d'événements fait avec sa cible, il serait souhaitable que le gestionnaire puisse être désabonné.

0voto

Andrew Hare Points 159332

Non, il n'y a pas d'équivalent. Y a-t-il une raison particulière pour laquelle WeakReference ne fera pas l'affaire ?

Voici une question similaire à la vôtre :

Pourquoi .NET ne dispose-t-il pas d'une SoftReference ainsi que d'une WeakReference, comme Java ?

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