В документации MSDN для MemoryCache.Set, к сожалению, явно не указано, является ли он потокобезопасным или нет.
Безопасно ли использовать .Get()
и .Set()
из нескольких потоков без явной блокировки?
В документации MSDN для MemoryCache.Set, к сожалению, явно не указано, является ли он потокобезопасным или нет.
Безопасно ли использовать .Get()
и .Set()
из нескольких потоков без явной блокировки?
Да, класс MemoryCache безопасен для потоков:
System.Runtime.Caching.MemoryCache является потокобезопасным. Несколько параллельных потоков могут читать и записывать экземпляр MemoryCache. Внутренняя безопасность потоков автоматически обрабатывается, чтобы обеспечить согласованное обновление кеша.
Это может означать, что данные, хранящиеся в кеше, могут сами по себе не быть потокобезопасными. Например, если список помещается в кеш, и два отдельных потока получают ссылку на кешированный список, два потока в конечном итоге будут наступать друг на друга, если они оба попытаются обновить список одновременно.
При этом методы Get и Set являются потокобезопасными, но если структура данных, которую вы можете хранить в этом кеше, не является потокобезопасной, у вас могут возникнуть проблемы. Представьте, например, что вы сохранили словарь внутри этого кеша. Затем, в то время как поток 1 использует Get
для получения словаря и начинает чтение из него, поток 2 использует Get
для получения этого же словаря и пытается записать в него. Хотя операция Get будет потокобезопасной, то, что произойдет дальше, может быть довольно неприятным.
В документации для MemoryCache
указано:
Этот тип является потокобезопасным.
MemoryCache
) вместо этого дает вам счастливый результат, который вы искали.
- person jason; 18.07.2011