Поделиться через


LazyThreadSafetyMode Перечисление

Определение

Указывает, как экземпляр Lazy<T> синхронизирует доступ между несколькими потоками.

public enum class LazyThreadSafetyMode
public enum LazyThreadSafetyMode
type LazyThreadSafetyMode = 
Public Enum LazyThreadSafetyMode
Наследование
LazyThreadSafetyMode

Поля

Имя Значение Описание
None 0

Экземпляр Lazy<T> не является потокобезопасным. Если доступ к экземпляру осуществляется из нескольких потоков, его поведение не определено. Используйте этот режим, только если высокая производительность имеет решающее значение, и Lazy<T> экземпляр гарантированно никогда не инициализируется из нескольких потоков. Если используется Lazy<T> конструктор, указывающий метод инициализации (valueFactory параметр), и если этот метод инициализации вызывает исключение (или не обрабатывает исключение) при первом вызове Value свойства, то исключение кэшируется и создается повторно при последующих вызовах Value свойства. Если вы используете конструктор Lazy<T>, который не указывает метод инициализации, исключения, вызываемые конструктором без параметров для T, не кэшируются. В этом случае последующий вызов Value свойства может успешно инициализировать Lazy<T> экземпляр. Если метод инициализации рекурсивно обращается к Value свойству экземпляра Lazy<T> , InvalidOperationException создается исключение.

PublicationOnly 1

Если несколько потоков пытаются инициализировать Lazy<T> экземпляр одновременно, все потоки могут запускать метод инициализации (или конструктор без параметров, если метод инициализации отсутствует). Первый поток для завершения инициализации задает значение экземпляра Lazy<T> . Это называется Publication именами полей. Это значение возвращается другим потокам, которые одновременно выполняют метод инициализации, если только метод инициализации не создает исключения для этих потоков. Все экземпляры T , созданные конкурирующими потоками, удаляются. Фактически публикация инициализированного значения является потокобезопасной в том смысле, что только одно из инициализированных значений может быть опубликовано и использовано всеми потоками. Если метод инициализации создает исключение для любого потока, исключение распространяется из Value свойства в этом потоке. Исключение не кэшируется. Значение IsValueCreated свойства остается false, а последующие вызовы Value свойства либо потоком, в котором возникло исключение, либо другими потоками, приводят к повторному выполнению метода инициализации. Если метод инициализации рекурсивно обращается к Value свойству экземпляра Lazy<T> , исключение не возникает.

ExecutionAndPublication 2

Блокировки используются для обеспечения безопасной потоковой инициализации Lazy<T> экземпляра только одним потоком. Фактически метод инициализации выполняется в потокобезопасном режиме (например Execution , в имени поля). Publication инициализированного значения также является потокобезопасным в том смысле, что только одно значение может быть опубликовано и использовано всеми потоками. Если метод инициализации (или конструктор без параметров, при отсутствии метода инициализации) внутренне использует блокировки, взаимоблокировки могут возникать. Если используется Lazy<T> конструктор, указывающий метод инициализации (valueFactory параметр), и если этот метод инициализации вызывает исключение (или не обрабатывает исключение) при первом вызове Value свойства, то исключение кэшируется и создается повторно при последующих вызовах Value свойства. Если вы используете конструктор Lazy<T>, который не указывает метод инициализации, исключения, вызываемые конструктором без параметров для T, не кэшируются. В этом случае последующий вызов Value свойства может успешно инициализировать Lazy<T> экземпляр. Если метод инициализации рекурсивно обращается к Value свойству экземпляра Lazy<T> , InvalidOperationException создается исключение.

Комментарии

Используйте это перечисление, чтобы указать 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
Нет Кэшированные Не кэширован
ПубликацияOnly Не кэширован Не кэширован
ExecutionAndPublication Кэшированные Не кэширован

Применяется к

См. также раздел