Partager via


LazyThreadSafetyMode Énumération

Définition

Spécifie comment une instance de Lazy<T> synchronise l’accès entre plusieurs threads.

public enum class LazyThreadSafetyMode
public enum LazyThreadSafetyMode
type LazyThreadSafetyMode = 
Public Enum LazyThreadSafetyMode
Héritage
LazyThreadSafetyMode

Champs

ExecutionAndPublication 2

Des verrous sont utilisés pour qu’un seul thread puisse initialiser une instance de Lazy<T> d’une façon thread-safe. En effet, la méthode d’initialisation est exécutée de manière thread-safe (appelée dans Execution le nom du champ). Publication de la valeur initialisée est également thread-safe dans le sens où une seule valeur peut être publiée et utilisée par tous les threads. Si la méthode d’initialisation (ou le constructeur sans paramètre, s’il n’existe aucune méthode d’initialisation) utilise des verrous en interne, des blocages peuvent se produire. Si vous utilisez un constructeur Lazy<T> qui spécifie une méthode d’initialisation (paramètre valueFactory) et si cette méthode d’initialisation lève une exception (ou échoue à gérer une exception), la première fois que vous appelez la propriété Value, l’exception est mise en cache et levée à nouveau lors des appels ultérieurs à la propriété Value. Si vous utilisez un constructeur Lazy<T> qui ne spécifie pas de méthode d’initialisation, les exceptions levées par le constructeur sans paramètre pour T ne sont pas mises en cache. Dans ce cas, un appel ultérieur à la propriété Value peut initialiser correctement l’instance de Lazy<T>. Si la méthode d’initialisation accède de façon récursive à la propriété Value de l’instance de Lazy<T>, une InvalidOperationException est levée.

None 0

L’instance de Lazy<T> n’est pas thread-safe ; si plusieurs threads accèdent à l’instance, son comportement est non défini. Utilisez ce mode seulement quand des performances élevées sont cruciales et s’il est certain que l’instance de Lazy<T> n’est jamais initialisée par plusieurs threads. Si vous utilisez un constructeur Lazy<T> qui spécifie une méthode d’initialisation (paramètre valueFactory) et si cette méthode d’initialisation lève une exception (ou échoue à gérer une exception), la première fois que vous appelez la propriété Value, l’exception est mise en cache et levée à nouveau lors des appels ultérieurs à la propriété Value. Si vous utilisez un constructeur Lazy<T> qui ne spécifie pas de méthode d’initialisation, les exceptions levées par le constructeur sans paramètre pour T ne sont pas mises en cache. Dans ce cas, un appel ultérieur à la propriété Value peut initialiser correctement l’instance de Lazy<T>. Si la méthode d’initialisation accède de façon récursive à la propriété Value de l’instance de Lazy<T>, une InvalidOperationException est levée.

PublicationOnly 1

Quand plusieurs threads tentent simultanément d’initialiser une instance de Lazy<T>, tous les threads sont autorisés à exécuter la méthode d’initialisation (ou le constructeur sans paramètre, s’il n’existe aucune méthode d’initialisation). Le premier thread qui termine l’initialisation définit la valeur de l’instance de Lazy<T>. Il s’agit des Publication noms de champs. Cette valeur est retournée à tous les autres threads qui exécutaient simultanément la méthode d’initialisation, à moins que la méthode d’initialisation lève des exceptions sur ces threads. Toutes les instances de T qui ont été créées par les threads concurrents sont abandonnées. En effet, la publication de la valeur initialisée est thread-safe dans le sens où une seule des valeurs initialisées peut être publiée et utilisée par tous les threads. Si la méthode d’initialisation lève une exception sur un thread, l’exception est propagée à partir de la propriété Value sur ce thread. L’exception n’est pas mise en cache. La valeur de la propriété IsValueCreated reste false, et les appels suivants à la propriété Value par le thread où l’exception a été levée ou par d’autres threads provoquent la réexécution de la méthode d’initialisation. Si la méthode d’initialisation accède de façon récursive à la propriété Value de l’instance de Lazy<T>, aucune exception n’est levée.

Remarques

Utilisez cette énumération pour spécifier le mode paramètre des Lazy<T> constructeurs. Les effets de tous les constructeurs sur la synchronisation de threads peuvent être décrits en termes d’énumération, qu’ils aient ou non des mode paramètres.

Une Lazy<T> instance est initialisée par une méthode d’initialisation spécifiée par l’utilisateur ou par le constructeur sans paramètre pour T. La méthode d’initialisation est spécifiée par le valueFactory paramètre d’un Lazy<T> constructeur. La méthode retourne une instance de T, qui est le type instancié par l’instance de Lazy<T>. Si un constructeur n’a pas de valueFactory paramètre, le constructeur sans paramètre pour T lequel il est utilisé pour initialiser l’instance Lazy<T> . Dans les deux cas, l’initialisation se produit la première fois que vous appelez la Lazy<T>.Value propriété.

Outre la spécification de la sécurité du thread d’une Lazy<T> instance, cette énumération affecte la mise en cache des exceptions. Lorsque des exceptions sont mises en cache pour une Lazy<T> instance, vous n’avez qu’une seule chance d’initialiser l’instance. Si une exception est levée la première fois que vous appelez la Lazy<T>.Value propriété, cette exception est mise en cache et réinitie sur tous les appels suivants à la Lazy<T>.Value propriété. L’avantage des exceptions de mise en cache est que les deux threads obtiennent toujours le même résultat, même lorsque des erreurs se produisent.

Lorsque vous spécifiez le mode PublicationOnly, les exceptions ne sont jamais mises en cache. Lorsque vous spécifiez None ou ExecutionAndPublication, la mise en cache dépend du fait que vous spécifiez une méthode d’initialisation ou que vous autorisez le constructeur sans paramètre à T utiliser. La spécification d’une méthode d’initialisation permet la mise en cache des exceptions pour ces deux modes. La méthode d’initialisation peut être très simple. Par exemple, il peut appeler le constructeur sans paramètre pour T: new Lazy<Contents>(() => new Contents(), mode) en C#, ou New Lazy(Of Contents)(Function() New Contents()) dans Visual Basic. Si vous utilisez un constructeur qui ne spécifie pas de méthode d’initialisation, les exceptions levées par le constructeur sans paramètre pour T ne sont pas mises en cache. Le tableau suivant récapitule le comportement de mise en cache des exceptions.

Mode Utilisation de la méthode d’initialisation Utilisation du constructeur sans paramètre pour T
Aucun Mis en cache Non mis en cache
PublicationOnly Non mis en cache Non mis en cache
ExecutionAndPublication Mis en cache Non mis en cache

S’applique à

Voir aussi