Эквивалент SoftReference в .net? - PullRequest
5 голосов
/ 10 марта 2009

Я знаком с WeakReference, но я ищу ссылочный тип, который очищается только при нехватке памяти, а не просто каждый раз, когда запускается gc (точно так же, как SoftReference в Java) , Я ищу способ реализовать кэш, чувствительный к памяти.

Ответы [ 5 ]

2 голосов
/ 10 марта 2009

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

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

...

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

Вы можете создать класс SoftReference, расширив WeakReference по линиям

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

Вам также необходимо переопределить сеттер в Target, чтобы убедиться, что любая новая цель попадает в кеш.

2 голосов
/ 10 марта 2009

Может быть, класс ASP.NET Cache ( System.Web.Caching.Cache ) может помочь достичь того, что вы хотите? Он автоматически удаляет объекты, если памяти становится мало:

Вот статья , в которой показано, как использовать класс Cache в приложении для форм Windows.

2 голосов
/ 10 марта 2009

В дополнение к ASP.NET Cache есть блок приложения кэширования из группы Microsoft Patterns and Practices.

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

1 голос
/ 09 июня 2012

Хотя SoftReference может показаться удобным способом реализации кэширования памяти, требуется, чтобы среда выполнения Java сделала несколько произвольное определение того, превышает ли выгода от хранения объекта стоимость его хранения. К сожалению, среда выполнения имеет ограниченную информацию о реальной стоимости хранения объекта (учитывая, что реальная стоимость может включать влияние использования памяти приложением на другие приложения), и практически не имеет информации о преимуществах сохранения объекта вокруг него. .

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

Между прочим, если бы у меня были мои барабанщики, .net поддерживал бы другой тип ссылки, которого я не видел ни на одной платформе: ссылку "интереса для кого-то другого", которая использовалась бы в сочетании с типом WeakReference. Ссылка «представляющая интерес для кого-то другого» может быть использована в качестве строгой ссылки, но подходящая конфигурация WeakReference будет признана недействительной, если единственные сильные ссылки на ее цель будут «представлять интерес для кого-то другого». Такая концепция может повысить эффективность при использовании одновременного GC в тех случаях, когда обработчик слабых событий будет многократно генерировать сильную ссылку на свою цель. Если на самом деле никто не интересуется, что делает обработчик событий со своей целью, было бы желательно, чтобы обработчик мог отписаться.

0 голосов
/ 10 марта 2009

Нет, не существует эквивалента. Есть ли конкретная причина, по которой WeakReference не справится с работой?

Вот вопрос, похожий на ваш:

Почему .NET не имеет SoftReference, а также WeakReference, как Java?

...