ConcurrentDictionary<TKey,TValue>.GetOrAdd ConcurrentDictionary<TKey,TValue>.GetOrAdd ConcurrentDictionary<TKey,TValue>.GetOrAdd ConcurrentDictionary<TKey,TValue>.GetOrAdd Method

Définition

Ajoute une paire clé/valeur au ConcurrentDictionary<TKey,TValue> si la clé n'existe pas encore.Adds a key/value pair to the ConcurrentDictionary<TKey,TValue> if the key does not already exist. Retourne la nouvelle valeur ou la valeur existante si la clé existe déjà.Returns the new value, or the existing value if the key already exists.

Surcharges

GetOrAdd(TKey, Func<TKey,TValue>) GetOrAdd(TKey, Func<TKey,TValue>) GetOrAdd(TKey, Func<TKey,TValue>) GetOrAdd(TKey, Func<TKey,TValue>)

Ajoute une paire clé/valeur à ConcurrentDictionary<TKey,TValue> en utilisant la fonction spécifiée, si la clé n'existe pas.Adds a key/value pair to the ConcurrentDictionary<TKey,TValue> by using the specified function if the key does not already exist. Retourne la nouvelle valeur ou la valeur existante si la clé existe.Returns the new value, or the existing value if the key exists.

GetOrAdd(TKey, TValue) GetOrAdd(TKey, TValue) GetOrAdd(TKey, TValue) GetOrAdd(TKey, TValue)

Ajoute une paire clé/valeur au ConcurrentDictionary<TKey,TValue> si la clé n'existe pas encore.Adds a key/value pair to the ConcurrentDictionary<TKey,TValue> if the key does not already exist. Retourne la nouvelle valeur ou la valeur existante si la clé existe.Returns the new value, or the existing value if the key exists.

GetOrAdd<TArg>(TKey, Func<TKey,TArg,TValue>, TArg) GetOrAdd<TArg>(TKey, Func<TKey,TArg,TValue>, TArg) GetOrAdd<TArg>(TKey, Func<TKey,TArg,TValue>, TArg) GetOrAdd<TArg>(TKey, Func<TKey,TArg,TValue>, TArg)

Ajoute une paire clé/valeur au ConcurrentDictionary<TKey,TValue> en utilisant la fonction spécifiée et un argument si la clé n’existe pas déjà, ou retourne la valeur existante si la clé existe.Adds a key/value pair to the ConcurrentDictionary<TKey,TValue> by using the specified function and an argument if the key does not already exist, or returns the existing value if the key exists.

Exemples

L’exemple suivant montre comment appeler le GetOrAdd méthode :The following example shows how to call the GetOrAdd method:

class CD_GetOrAddOrUpdate
{
    // Demonstrates:
    //      ConcurrentDictionary<TKey, TValue>.AddOrUpdate()
    //      ConcurrentDictionary<TKey, TValue>.GetOrAdd()
    //      ConcurrentDictionary<TKey, TValue>[]
    static void Main()
    {
        // Construct a ConcurrentDictionary
        ConcurrentDictionary<int, int> cd = new ConcurrentDictionary<int, int>();

        // Bombard the ConcurrentDictionary with 10000 competing AddOrUpdates
        Parallel.For(0, 10000, i =>
        {
            // Initial call will set cd[1] = 1.  
            // Ensuing calls will set cd[1] = cd[1] + 1
            cd.AddOrUpdate(1, 1, (key, oldValue) => oldValue + 1);
        });

        Console.WriteLine("After 10000 AddOrUpdates, cd[1] = {0}, should be 10000", cd[1]);

        // Should return 100, as key 2 is not yet in the dictionary
        int value = cd.GetOrAdd(2, (key) => 100);
        Console.WriteLine("After initial GetOrAdd, cd[2] = {0} (should be 100)", value);

        // Should return 100, as key 2 is already set to that value
        value = cd.GetOrAdd(2, 10000);
        Console.WriteLine("After second GetOrAdd, cd[2] = {0} (should be 100)", value);
    }
}
' Imports System.Collections.Concurrent
' Imports System.Threading.Tasks
Class CD_GetOrAddOrUpdate

    ' Demonstrates:
    ' ConcurrentDictionary<TKey, TValue>.AddOrUpdate()
    ' ConcurrentDictionary<TKey, TValue>.GetOrAdd()
    ' ConcurrentDictionary<TKey, TValue>[]
    Shared Sub Main()
        ' Construct a ConcurrentDictionary
        Dim cd As New ConcurrentDictionary(Of Integer, Integer)()

        ' Bombard the ConcurrentDictionary with 10000 competing AddOrUpdates
        Parallel.For(0, 10000,
                       Sub(i)
                           ' Initial call will set cd[1] = 1. 
                           ' Ensuing calls will set cd[1] = cd[1] + 1
                           cd.AddOrUpdate(1, 1, Function(key, oldValue) oldValue + 1)
                       End Sub)

        Console.WriteLine("After 10000 AddOrUpdates, cd[1] = {0}, should be 10000", cd(1))

        ' Should return 100, as key 2 is not yet in the dictionary
        Dim value As Integer = cd.GetOrAdd(2, Function(key) 100)
        Console.WriteLine("After initial GetOrAdd, cd[2] = {0} (should be 100)", value)

        ' Should return 100, as key 2 is already set to that value
        value = cd.GetOrAdd(2, 10000)
        Console.WriteLine("After second GetOrAdd, cd[2] = {0} (should be 100)", value)
    End Sub
End Class

GetOrAdd(TKey, Func<TKey,TValue>) GetOrAdd(TKey, Func<TKey,TValue>) GetOrAdd(TKey, Func<TKey,TValue>) GetOrAdd(TKey, Func<TKey,TValue>)

Ajoute une paire clé/valeur à ConcurrentDictionary<TKey,TValue> en utilisant la fonction spécifiée, si la clé n'existe pas.Adds a key/value pair to the ConcurrentDictionary<TKey,TValue> by using the specified function if the key does not already exist. Retourne la nouvelle valeur ou la valeur existante si la clé existe.Returns the new value, or the existing value if the key exists.

public:
 TValue GetOrAdd(TKey key, Func<TKey, TValue> ^ valueFactory);
public TValue GetOrAdd (TKey key, Func<TKey,TValue> valueFactory);
member this.GetOrAdd : 'Key * Func<'Key, 'Value> -> 'Value
Public Function GetOrAdd (key As TKey, valueFactory As Func(Of TKey, TValue)) As TValue

Paramètres

key
TKey TKey TKey TKey

Clé de l'élément à ajouter.The key of the element to add.

valueFactory
Func<TKey,TValue>

Fonction utilisée pour générer une valeur pour la clé.The function used to generate a value for the key.

Retours

TValue TValue TValue TValue

Valeur pour la clé.The value for the key. Il s'agit de la valeur existante pour la clé si la clé est déjà dans le dictionnaire, ou de la nouvelle valeur si la clé n'était pas dans le dictionnaire.This will be either the existing value for the key if the key is already in the dictionary, or the new value if the key was not in the dictionary.

Exceptions

key ou valueFactory a la valeur null.key or valueFactory is null.

Le dictionnaire contient déjà le nombre maximal d'éléments (MaxValue).The dictionary already contains the maximum number of elements (MaxValue).

Remarques

Pour les modifications et les opérations d’écriture dans le dictionnaire, ConcurrentDictionary<TKey,TValue> utilise le verrouillage de granularité fine pour garantir la sécurité des threads.For modifications and write operations to the dictionary, ConcurrentDictionary<TKey,TValue> uses fine-grained locking to ensure thread safety. (Les opérations de lecture sur le dictionnaire sont effectuées de manière sans verrou). Toutefois, le valueFactory délégué est appelé en dehors des verrous pour éviter les problèmes qui peuvent survenir lors de l’exécution de code inconnu sous un verrou.(Read operations on the dictionary are performed in a lock-free manner.) However, the valueFactory delegate is called outside the locks to avoid the problems that can arise from executing unknown code under a lock. Par conséquent, GetOrAdd n’est pas atomique en ce qui concerne toutes les autres opérations sur le ConcurrentDictionary<TKey,TValue> classe.Therefore, GetOrAdd is not atomic with regards to all other operations on the ConcurrentDictionary<TKey,TValue> class.

Dans la mesure où une clé/valeur peuvent être insérée par un autre thread pendant valueFactory est générant une valeur, vous ne pouvez pas font confiance à ce parce que valueFactory exécutée, sa valeur produit sera inséré dans le dictionnaire et retournée.Since a key/value can be inserted by another thread while valueFactory is generating a value, you cannot trust that just because valueFactory executed, its produced value will be inserted into the dictionary and returned. Si vous appelez GetOrAdd simultanément sur différents threads, valueFactory peut être appelée plusieurs fois, mais la paire clé/valeur qu’un seul sera ajoutée au dictionnaire.If you call GetOrAdd simultaneously on different threads, valueFactory may be called multiple times, but only one key/value pair will be added to the dictionary.

La valeur de retour dépend de la présence de la clé dans le dictionnaire et indique si une clé/valeur est insérée par un autre thread après GetOrAdd est appelée, mais avant valueFactory génère une valeur :The return value depends on the presence of the key in the dictionary and whether a key/value is inserted by another thread after GetOrAdd is called but before valueFactory generates a value:

ScénarioScenario Valeur de retourReturn value
La clé est déjà dans le dictionnaire.The key is already in the dictionary. La valeur existante est retournée.The existing value is returned.
La clé n’est pas dans le dictionnaire.The key is not in the dictionary. valueFactory génère une valeur.valueFactory generates a value. Sur la nouvelle vérification de la clé, aucune clé est trouvée.On rechecking for the key, no key is found. La clé/valeur est insérée dans le dictionnaire, et la valeur est retournée.The key/value is inserted into the dictionary, and the value is returned.
La clé n’est pas dans le dictionnaire.The key is not in the dictionary. valueFactory génère une valeur.valueFactory generates a value. Bien que valueFactory est à la génération de la valeur, un thread différent insère une valeur pour la clé.While valueFactory is generating the value, a different thread inserts a value for the key. Après avoir valueFactory s’exécute et lors de la nouvelle vérification de la clé, la clé insérée par l’autre thread est trouvée.After valueFactory executes and upon rechecking for the key, the key inserted by the other thread is found. La valeur insérée par l’autre thread est retournée.The value inserted by the other thread is returned.
Voir aussi

GetOrAdd(TKey, TValue) GetOrAdd(TKey, TValue) GetOrAdd(TKey, TValue) GetOrAdd(TKey, TValue)

Ajoute une paire clé/valeur au ConcurrentDictionary<TKey,TValue> si la clé n'existe pas encore.Adds a key/value pair to the ConcurrentDictionary<TKey,TValue> if the key does not already exist. Retourne la nouvelle valeur ou la valeur existante si la clé existe.Returns the new value, or the existing value if the key exists.

public:
 TValue GetOrAdd(TKey key, TValue value);
public TValue GetOrAdd (TKey key, TValue value);
member this.GetOrAdd : 'Key * 'Value -> 'Value
Public Function GetOrAdd (key As TKey, value As TValue) As TValue

Paramètres

key
TKey TKey TKey TKey

Clé de l'élément à ajouter.The key of the element to add.

value
TValue TValue TValue TValue

Valeur à ajouter, si la clé n’existe pas encore.The value to be added, if the key does not already exist.

Retours

TValue TValue TValue TValue

Valeur pour la clé.The value for the key. Il s'agit de la valeur existante pour la clé si la clé est déjà dans le dictionnaire, ou de la nouvelle valeur si la clé n'était pas dans le dictionnaire.This will be either the existing value for the key if the key is already in the dictionary, or the new value if the key was not in the dictionary.

Exceptions

Le dictionnaire contient déjà le nombre maximal d'éléments (MaxValue).The dictionary already contains the maximum number of elements (MaxValue).

Voir aussi

GetOrAdd<TArg>(TKey, Func<TKey,TArg,TValue>, TArg) GetOrAdd<TArg>(TKey, Func<TKey,TArg,TValue>, TArg) GetOrAdd<TArg>(TKey, Func<TKey,TArg,TValue>, TArg) GetOrAdd<TArg>(TKey, Func<TKey,TArg,TValue>, TArg)

Ajoute une paire clé/valeur au ConcurrentDictionary<TKey,TValue> en utilisant la fonction spécifiée et un argument si la clé n’existe pas déjà, ou retourne la valeur existante si la clé existe.Adds a key/value pair to the ConcurrentDictionary<TKey,TValue> by using the specified function and an argument if the key does not already exist, or returns the existing value if the key exists.

public:
generic <typename TArg>
 TValue GetOrAdd(TKey key, Func<TKey, TArg, TValue> ^ valueFactory, TArg factoryArgument);
public TValue GetOrAdd<TArg> (TKey key, Func<TKey,TArg,TValue> valueFactory, TArg factoryArgument);
member this.GetOrAdd : 'Key * Func<'Key, 'Arg, 'Value> * 'Arg -> 'Value
Public Function GetOrAdd(Of TArg) (key As TKey, valueFactory As Func(Of TKey, TArg, TValue), factoryArgument As TArg) As TValue

Paramètres de type

TArg

Le type d’un argument à passer à valueFactory.The type of an argument to pass into valueFactory.

Paramètres

key
TKey TKey TKey TKey

Clé de l'élément à ajouter.The key of the element to add.

valueFactory
Func<TKey,TArg,TValue>

Fonction utilisée pour générer une valeur pour la clé.The function used to generate a value for the key.

factoryArgument

Valeur d’argument à passer dans valueFactory.An argument value to pass into valueFactory.

Retours

TValue TValue TValue TValue

Valeur pour la clé.The value for the key. Il s'agit de la valeur existante pour la clé si la clé est déjà dans le dictionnaire, ou de la nouvelle valeur si la clé n'était pas dans le dictionnaire.This will be either the existing value for the key if the key is already in the dictionary, or the new value if the key was not in the dictionary.

Exceptions

key est un null référence (Nothing en Visual Basic).key is a null reference (Nothing in Visual Basic).

Le dictionnaire contient trop d’éléments.The dictionary contains too many elements.

Remarques

Pour les modifications et les opérations d’écriture dans le dictionnaire, ConcurrentDictionary<TKey,TValue> utilise le verrouillage de granularité fine pour garantir la sécurité des threads.For modifications and write operations to the dictionary, ConcurrentDictionary<TKey,TValue> uses fine-grained locking to ensure thread safety. (Les opérations de lecture sur le dictionnaire sont effectuées de manière sans verrou). Toutefois, le valueFactory délégué est appelé en dehors des verrous pour éviter les problèmes qui peuvent survenir lors de l’exécution de code inconnu sous un verrou.(Read operations on the dictionary are performed in a lock-free manner.) However, the valueFactory delegate is called outside the locks to avoid the problems that can arise from executing unknown code under a lock. Par conséquent, GetOrAdd n’est pas atomique en ce qui concerne toutes les autres opérations sur le ConcurrentDictionary<TKey,TValue> classe.Therefore, GetOrAdd is not atomic with regards to all other operations on the ConcurrentDictionary<TKey,TValue> class.

Dans la mesure où une clé/valeur peuvent être insérée par un autre thread pendant valueFactory est générant une valeur, vous ne pouvez pas font confiance à ce parce que valueFactory exécutée, sa valeur produit sera inséré dans le dictionnaire et retournée.Since a key/value can be inserted by another thread while valueFactory is generating a value, you cannot trust that just because valueFactory executed, its produced value will be inserted into the dictionary and returned. Si vous appelez GetOrAdd simultanément sur différents threads, valueFactory peut être appelée plusieurs fois, mais la paire clé/valeur qu’un seul sera ajoutée au dictionnaire.If you call GetOrAdd simultaneously on different threads, valueFactory may be called multiple times, but only one key/value pair will be added to the dictionary.

La valeur de retour dépend de la présence de la clé dans le dictionnaire et indique si une clé/valeur est insérée par un autre thread après GetOrAdd est appelée, mais avant valueFactory génère une valeur :The return value depends on the presence of the key in the dictionary and whether a key/value is inserted by another thread after GetOrAdd is called but before valueFactory generates a value:

ScénarioScenario Valeur de retourReturn value
La clé est déjà dans le dictionnaire.The key is already in the dictionary. La valeur existante est retournée.The existing value is returned.
La clé n’est pas dans le dictionnaire.The key is not in the dictionary. valueFactory génère une valeur.valueFactory generates a value. Sur la nouvelle vérification de la clé, aucune clé est trouvée.On rechecking for the key, no key is found. La clé/valeur est insérée dans le dictionnaire, et la valeur est retournée.The key/value is inserted into the dictionary, and the value is returned.
La clé n’est pas dans le dictionnaire.The key is not in the dictionary. valueFactory génère une valeur.valueFactory generates a value. Bien que valueFactory est à la génération de la valeur, un thread différent insère une valeur pour la clé.While valueFactory is generating the value, a different thread inserts a value for the key. Après avoir valueFactory s’exécute et lors de la nouvelle vérification de la clé, la clé insérée par l’autre thread est trouvée.After valueFactory executes and upon rechecking for the key, the key inserted by the other thread is found. La valeur insérée par l’autre thread est retournée.The value inserted by the other thread is returned.

S’applique à