System.Runtime.Caching.MemoryCache - необходима блокировка - PullRequest
8 голосов
/ 08 марта 2011

Нужно ли еще реализовывать блокировку при работе с System.Runtime.Caching.MemoryCache, например, вызывать Contains(key); или это уже потокобезопасно?

Ответы [ 2 ]

9 голосов
/ 08 марта 2011

Раздел «Безопасность потоков» в статье библиотеки MSDN о классе документирует это:

Любые члены экземпляра не гарантируют поточно-ориентированность.

Это вполне нормально для классов .NET, документация является шаблонной, а в некоторых отдельных случаях неинформативной. Так было и с MemoryCache до обновления документации. Статья обратной связи Connect, на которую ссылается Davide, полезна, чтобы прояснить это:

System.Runtime.Caching.MemoryCache является потокобезопасным. Несколько одновременных потоки могут читать и записывать экземпляр MemoryCache. внутренне потокобезопасность автоматически обрабатывается, чтобы гарантировать, что кэш обновлен в согласованном порядке.

Это может означать, что данные хранятся в кеше может сам по себе не быть потокобезопасным. Например, если список помещен в кеш и два отдельных потока оба получают ссылку на кешированный Список, два потока будут в конечном итоге наступать друг на друга, если они оба пытаются обновить список одновременно.

6 голосов
/ 30 марта 2011

Согласно новой документации класс MemoryCache является поточно-ориентированным классом.

* MSDN 1004 *

Microsoft connect

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...