LazyThreadSafetyMode LazyThreadSafetyMode LazyThreadSafetyMode LazyThreadSafetyMode Enum

Определение

Определяет, как экземпляр Lazy<T> синхронизирует доступ из нескольких потоков.Specifies how a Lazy<T> instance synchronizes access among multiple threads.

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

Поля

ExecutionAndPublication ExecutionAndPublication ExecutionAndPublication ExecutionAndPublication 2

Блокировки используются, чтобы убедиться, что только один поток может инициализировать экземпляр Lazy<T> потокобезопасным способом.Locks are used to ensure that only a single thread can initialize a Lazy<T> instance in a thread-safe manner. Если метод инициализации (или конструктор без параметров, если метод инициализации отсутствует) использует внутренние блокировки, могут возникнуть взаимоблокировки.If the initialization method (or the parameterless constructor, if there is no initialization method) uses locks internally, deadlocks can occur. Если вы используете конструктор Lazy<T>, который указывает метод инициализации (параметр valueFactory), и если этот метод инициализации вызывает исключение (или не может обработать исключение) при первом вызове свойства Value, исключение кэшируется и вызывается повторно в последующих вызовах свойства Value.If you use a Lazy<T> constructor that specifies an initialization method (valueFactory parameter), and if that initialization method throws an exception (or fails to handle an exception) the first time you call the Value property, then the exception is cached and thrown again on subsequent calls to the Value property. Если вы используете конструктор Lazy<T>, который не указывает метод инициализации, исключения, вызываемые конструктором без параметров для T, не кэшируются.If you use a Lazy<T> constructor that does not specify an initialization method, exceptions that are thrown by the parameterless constructor for T are not cached. В этом случае последующий вызов свойства Value может успешно инициализировать экземпляр Lazy<T>.In that case, a subsequent call to the Value property might successfully initialize the Lazy<T> instance. Если метод инициализации рекурсивно получает доступ к свойству Value экземпляра Lazy<T>, вызывается InvalidOperationException.If the initialization method recursively accesses the Value property of the Lazy<T> instance, an InvalidOperationException is thrown.

None None None None 0

Экземпляр Lazy<T> не является потокобезопасным; если доступ к экземпляру осуществляется из нескольких потоков, его поведение не определено.The Lazy<T> instance is not thread safe; if the instance is accessed from multiple threads, its behavior is undefined. Используйте этот режим только в том случае, когда крайне важна высокая производительность, а экземпляр Lazy<T> гарантированно не будет инициализирован больше, чем из одного потока.Use this mode only when high performance is crucial and the Lazy<T> instance is guaranteed never to be initialized from more than one thread. Если вы используете конструктор Lazy<T>, который указывает метод инициализации (параметр valueFactory), и если этот метод инициализации вызывает исключение (или не может обработать исключение) при первом вызове свойства Value, исключение кэшируется и вызывается повторно в последующих вызовах свойства Value.If you use a Lazy<T> constructor that specifies an initialization method (valueFactory parameter), and if that initialization method throws an exception (or fails to handle an exception) the first time you call the Value property, then the exception is cached and thrown again on subsequent calls to the Value property. Если вы используете конструктор Lazy<T>, который не указывает метод инициализации, исключения, вызываемые конструктором без параметров для T, не кэшируются.If you use a Lazy<T> constructor that does not specify an initialization method, exceptions that are thrown by the parameterless constructor for T are not cached. В этом случае последующий вызов свойства Value может успешно инициализировать экземпляр Lazy<T>.In that case, a subsequent call to the Value property might successfully initialize the Lazy<T> instance. Если метод инициализации рекурсивно получает доступ к свойству Value экземпляра Lazy<T>, вызывается InvalidOperationException.If the initialization method recursively accesses the Value property of the Lazy<T> instance, an InvalidOperationException is thrown.

PublicationOnly PublicationOnly PublicationOnly PublicationOnly 1

Если несколько потоков пытаются инициализировать экземпляр Lazy<T> одновременно, всем потокам разрешено выполнять метод инициализации (или конструктор без параметров, если нет метода инициализации).When multiple threads try to initialize a Lazy<T> instance simultaneously, all threads are allowed to run the initialization method (or the parameterless constructor, if there is no initialization method). Первый поток для выполнения инициализации задает значение экземпляра Lazy<T>.The first thread to complete initialization sets the value of the Lazy<T> instance. Это значение возвращается в любые другие потоки, которые одновременно выполняли метод инициализации, если метод инициализации не вызывал исключения в этих потоках.That value is returned to any other threads that were simultaneously running the initialization method, unless the initialization method throws exceptions on those threads. Любые экземпляры T, созданные конкурирующими потоками, удаляются.Any instances of T that were created by the competing threads are discarded. Если метод инициализации вызывает исключение в каком-либо потоке, исключение распространяется из свойства Value в этом потоке.If the initialization method throws an exception on any thread, the exception is propagated out of the Value property on that thread. Исключение не кэшируется.The exception is not cached. Значение свойства IsValueCreated остается false, и последующие вызовы свойства Value потоком, где возникло исключение, или другими потоками вызывают повторный запуск метода инициализации.The value of the IsValueCreated property remains false, and subsequent calls to the Value property, either by the thread where the exception was thrown or by other threads, cause the initialization method to run again. Если метод инициализации рекурсивно получает доступ к свойству Value экземпляра Lazy<T>, исключение не вызывается.If the initialization method recursively accesses the Value property of the Lazy<T> instance, no exception is thrown.

Комментарии

Используйте это перечисление, mode чтобы указать Lazy<T> параметр конструкторов.Use this enumeration to specify the mode parameter of Lazy<T> constructors. Влияние всех конструкторов на синхронизацию потоков можно описать в терминах этого перечисления, независимо от того, имеют mode ли они параметры.The effects of all constructors on thread synchronization can be described in terms of this enumeration, whether or not they have mode parameters.

Экземпляр инициализируется либо с помощью указанного пользователем метода инициализации, либо с помощью конструктора без параметров для T. Lazy<T>A Lazy<T> instance is initialized either by a user-specified initialization method or by the parameterless constructor for T. Метод инициализации задается valueFactory параметром Lazy<T> конструктора.The initialization method is specified by the valueFactory parameter of a Lazy<T> constructor. Метод возвращает экземпляр класса T, который является типом, экземпляром которого является отложенный Lazy<T>экземпляр.The method returns an instance of T, which is the type that is lazily instantiated by the instance of Lazy<T>. Если у конструктора valueFactory нет параметра, конструктор без параметров для T используется для инициализации Lazy<T> экземпляра.If a constructor does not have a valueFactory parameter, the parameterless constructor for T is used to initialize the Lazy<T> instance. В любом случае инициализация выполняется при первом вызове Lazy<T>.Value свойства.In either case, initialization occurs the first time you call the Lazy<T>.Value property.

Помимо указания потокобезопасности Lazy<T> экземпляра, это перечисление влияет на кэширование исключений.In addition to specifying the thread safety of a Lazy<T> instance, this enumeration affects exception caching. При кэшировании исключений для Lazy<T> экземпляра вы получаете только одну шанс инициализировать экземпляр.When exceptions are cached for a Lazy<T> instance, you get only one chance to initialize the instance. Если исключение создается при первом вызове Lazy<T>.Value свойства, это исключение кэшируется и повторно вызывается при всех последующих вызовах Lazy<T>.Value свойства.If an exception is thrown the first time you call the Lazy<T>.Value property, that exception is cached and rethrown on all subsequent calls to the Lazy<T>.Value property. Преимущество кэширования исключений состоит в том, что все два потока всегда получают одинаковый результат даже при возникновении ошибок.The advantage of caching exceptions is that any two threads always get the same result, even when errors occur.

При указании режима PublicationOnly исключения никогда не кэшируются.When you specify the PublicationOnly mode, exceptions are never cached. При указании None или режим потоковой кэширование зависит от того, указан ли метод инициализации или разрешается использовать конструктор T без параметров.When you specify None or ExecutionAndPublication, caching depends on whether you specify an initialization method or allow the parameterless constructor for T to be used. Указание метода инициализации включает кэширование исключений для этих двух режимов.Specifying an initialization method enables exception caching for these two modes. Метод инициализации может быть очень простым.The initialization method can be very simple. Например, он может вызвать конструктор без параметров Tдля: new Lazy<Contents>(() => new Contents(), mode) в C#или New Lazy(Of Contents)(Function() New Contents()) в Visual Basic.For example, it might call the parameterless constructor for T: new Lazy<Contents>(() => new Contents(), mode) in C#, or New Lazy(Of Contents)(Function() New Contents()) in Visual Basic. При использовании конструктора, не определяющего метод инициализации, исключения, вызываемые конструктором без параметров для T , не кэшируются.If you use a constructor that does not specify an initialization method, exceptions that are thrown by the parameterless constructor for T are not cached. В следующей таблице приводится сводка поведения кэширования исключений.The following table summarizes exception caching behavior.

РежимMode Использование метода инициализацииUsing initialization method Использование конструктора без параметров дляTUsing parameterless constructor for T
НетNone КэшированоCached Не кэшированоNot cached
PublicationOnlyPublicationOnly Не кэшированоNot cached Не кэшированоNot cached
Режим потоковойExecutionAndPublication КэшированоCached Не кэшированоNot cached

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

Дополнительно