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 default 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 default 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 default 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 default 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.

Объект Lazy<T> экземпляр инициализируется с помощью метода инициализации, определяемое пользователем или конструктором по умолчанию для T.A Lazy<T> instance is initialized either by a user-specified initialization method or by the default 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 default 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 и ExecutionAndPublication, кэширование зависит от того указывает метод инициализации или разрешить конструктор по умолчанию для T для использования.When you specify None or ExecutionAndPublication, caching depends on whether you specify an initialization method or allow the default 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 default 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 default constructor for T are not cached. В следующей таблице приведены исключения, поведение кэширования.The following table summarizes exception caching behavior.

РежимMode С помощью метода инициализацииUsing initialization method С помощью конструктора по умолчанию для TUsing default constructor for T
NoneNone КэшированоCached НекэшируемыеNot cached
PublicationOnlyPublicationOnly НекэшируемыеNot cached НекэшируемыеNot cached
ExecutionAndPublicationExecutionAndPublication КэшированоCached НекэшируемыеNot cached

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

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