LazyThreadSafetyMode Énumération
Définition
Important
Certaines informations portent sur la préversion du produit qui est susceptible d’être en grande partie modifiée avant sa publication. Microsoft exclut toute garantie, expresse ou implicite, concernant les informations fournies ici.
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
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 |
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 |
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 |
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 |