Правильное использование кэша в ASP.NET

Posted by Dmytro Shteflyuk on under ASP.NET · English (11,132 views)

Часто в приложениях ASP.NET можно встретить код, подобный следующему:

1
2
3
4
5
if (Cache["SomeData"] != null)
{
    string name = ((SomeClass) Cache["SomeData"]).Name;
    //.....
}

Опытный программист, даже если он не страдает паранойей, сразу видит возможную проблему — NullReferenceException. Все дело в механизме работы кэша в ASP.NET. В идеальном случае объект, помещенный в кэш, будет храниться там до перезагрузки приложения, но на практике он может быть удален между двумя обращениями: во время сборки мусора, если закончилась память (поскольку кэш использует слабые ссылки WeakReference); другим потоком, когда нужно перегрузить данные.

Соответственно приведенный код будет работать в 99% случаев, но периодически в логах будут появляться ошибки, которые практически невозможно повторить. Вот правильное использование кэша:

1
2
3
4
5
6
SomeClass someClass = Cache["SomeData"] as SomeClass;
if (someClass != null)
{
    string name = someClass.Name;
    //.....
}

Не теряйте бдительности, они только этого и ждут! (о багах)

5 Responses to this entry

Subscribe to comments with RSS

said on Январь 14, 2008 at 01:43 · Permalink

спасибо…частенько встречался с подобным багом и руки опускались из-за неопытности :)

AM @
said on Апрель 4, 2008 at 20:06 · Permalink

я если честно не понял почему в первом случае может появиться NullReferenceException, ведь там проверка на null есть? и почему тогда не появится во втором.

said on Июнь 14, 2008 at 14:12 · Permalink

Тоже не особо понял. Первый вариант часто приводится в различных книгах.

Sergey
said on Октябрь 2, 2008 at 22:54 · Permalink

Использую первый вариант уже долгое время, никаких багов не замечал, к тому же всегда выставляю время хранения кэша. Обычно при пустом кэше происходит секундная заминка, но в целом все работает нормально.

said on Октябрь 8, 2008 at 09:11 · Permalink

Правильное использование кэша в ASP.NET…

Все дело в механизме работы кэша в ASP.NET. В идеальном случае объект, помещенный в кэш, будет храниться там до перезагрузки приложения, но на …

Comments are closed

Comments for this entry are closed for a while. If you have anything to say – use a contact form. Thank you for your patience.