LazyThreadSafetyMode Перечисление
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Определяет, как экземпляр Lazy<T> синхронизирует доступ из нескольких потоков.
public enum class LazyThreadSafetyMode
public enum LazyThreadSafetyMode
type LazyThreadSafetyMode =
Public Enum LazyThreadSafetyMode
- Наследование
Поля
ExecutionAndPublication | 2 | Блокировки используются, чтобы убедиться, что только один поток может инициализировать экземпляр Lazy<T> потокобезопасным способом. Фактически метод инициализации выполняется потокобезопасным способом (называется |
None | 0 | Экземпляр Lazy<T> не является потокобезопасным; если доступ к экземпляру осуществляется из нескольких потоков, его поведение не определено. Используйте этот режим только в том случае, когда крайне важна высокая производительность, а экземпляр Lazy<T> гарантированно не будет инициализирован больше, чем из одного потока. Если вы используете конструктор Lazy<T>, который указывает метод инициализации (параметр |
PublicationOnly | 1 | Если несколько потоков пытаются инициализировать экземпляр Lazy<T> одновременно, всем потокам разрешено выполнять метод инициализации (или конструктор без параметров, если нет метода инициализации). Первый поток для выполнения инициализации задает значение экземпляра Lazy<T>. Это называется |
Комментарии
Используйте это перечисление, чтобы указать mode
параметр Lazy<T> конструкторов. Влияние всех конструкторов на синхронизацию потоков можно описать с точки зрения этого перечисления независимо от того, имеют mode
ли они параметры.
Lazy<T> Экземпляр инициализируется методом инициализации, заданным пользователем, или конструктором без параметров для T
. Метод инициализации задается valueFactory
параметром конструктора Lazy<T> . Метод возвращает экземпляр T
, который является типом, экземпляром которого является отложенный экземпляр Lazy<T>. Если конструктор не имеет valueFactory
параметра, конструктор без параметров используется для T
инициализации экземпляра Lazy<T> . В любом случае инициализация происходит при первом вызове Lazy<T>.Value свойства.
Помимо указания безопасности потока экземпляра Lazy<T> , это перечисление влияет на кэширование исключений. При кэшировании исключений для экземпляра Lazy<T> вы получаете только один шанс инициализировать экземпляр. Если при первом вызове Lazy<T>.Value свойства возникает исключение, это исключение кэшируется и повторно создается при всех последующих вызовах Lazy<T>.Value свойства. Преимущество кэширования исключений заключается в том, что все два потока всегда получают одинаковый результат, даже если возникают ошибки.
При указании режима PublicationOnly исключения никогда не кэшируются. При указании None или ExecutionAndPublication кэширование зависит от того, указываете ли вы метод инициализации или разрешаете использовать конструктор T
без параметров. Указание метода инициализации включает кэширование исключений для этих двух режимов. Метод инициализации может быть очень простым. Например, он может вызвать конструктор без параметров для T
: new Lazy<Contents>(() => new Contents(), mode)
в C# или New Lazy(Of Contents)(Function() New Contents())
в Visual Basic. Если используется конструктор, не указывающий метод инициализации, исключения, создаваемые конструктором без параметров, T
не кэшируются. В следующей таблице приводится сводка по кэшированию исключений.
Режим | Использование метода инициализации | Использование конструктора без параметров для T |
---|---|---|
Нет | Кэшировано | Не кэширован |
PublicationOnly | Не кэширован | Не кэширован |
ExecutionAndPublication | Кэшировано | Не кэширован |