Является ли MemoryCache.Set () поточно-ориентированным? - PullRequest
34 голосов
/ 18 июля 2011

Документация MSDN для MemoryCache.Set , к сожалению, прямо не указывает, является ли она поточно-ориентированной или нет.

Безопасно ли использовать .Get() и .Set() из нескольких потоков без явной блокировки?

Ответы [ 2 ]

71 голосов
/ 18 июля 2011

Да, класс MemoryCache является поточно-ориентированным :

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

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

Это означает, что методы Get и Set являются поточно-ориентированными, но если структура данных, которую вы можете хранить в этом кеше, не поточнобезопасна, у вас могут возникнуть проблемы.Представьте, например, что вы сохранили словарь внутри этого кэша.Затем, пока thread1 использует Get для извлечения словаря и начинает чтение из него, thread2 использует Get для извлечения этого же словаря и пытается записать в него.Хотя операция Get будет поточно-ориентированной, дальнейшие действия могут быть довольно неприятными.

10 голосов
/ 18 июля 2011

Документация для MemoryCache гласит:

Этот тип является потокобезопасным.

...