LazyThreadSafetyMode Перечисление
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Указывает, как экземпляр Lazy<T> синхронизирует доступ между несколькими потоками.
public enum class LazyThreadSafetyMode
public enum LazyThreadSafetyMode
type LazyThreadSafetyMode =
Public Enum LazyThreadSafetyMode
- Наследование
Поля
| Имя | Значение | Описание |
|---|---|---|
| None | 0 | Экземпляр Lazy<T> не является потокобезопасным. Если доступ к экземпляру осуществляется из нескольких потоков, его поведение не определено. Используйте этот режим, только если высокая производительность имеет решающее значение, и Lazy<T> экземпляр гарантированно никогда не инициализируется из нескольких потоков. Если используется Lazy<T> конструктор, указывающий метод инициализации ( |
| PublicationOnly | 1 | Если несколько потоков пытаются инициализировать Lazy<T> экземпляр одновременно, все потоки могут запускать метод инициализации (или конструктор без параметров, если метод инициализации отсутствует). Первый поток для завершения инициализации задает значение экземпляра Lazy<T> . Это называется |
| ExecutionAndPublication | 2 | Блокировки используются для обеспечения безопасной потоковой инициализации 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 |
|---|---|---|
| Нет | Кэшированные | Не кэширован |
| ПубликацияOnly | Не кэширован | Не кэширован |
| ExecutionAndPublication | Кэшированные | Не кэширован |