ConcurrentDictionary<TKey,TValue>.AddOrUpdate Méthode
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.
Ajoute une paire clé/valeur au ConcurrentDictionary<TKey,TValue> si la clé n'existe pas déjà, ou met à jour une paire clé/valeur dans le ConcurrentDictionary<TKey,TValue> si la clé existe déjà.
Surcharges
AddOrUpdate(TKey, Func<TKey,TValue>, Func<TKey,TValue,TValue>) |
Utilise les fonctions spécifiées pour ajouter une paire clé/valeur au ConcurrentDictionary<TKey,TValue> si la clé n'existe pas déjà, ou pour mettre à jour une paire clé/valeur dans le ConcurrentDictionary<TKey,TValue> en utilisant la fonction spécifiée si la clé existe déjà. |
AddOrUpdate(TKey, TValue, Func<TKey,TValue,TValue>) |
Ajoute une paire clé/valeur au ConcurrentDictionary<TKey,TValue> si la clé n'existe pas déjà, ou met à jour une paire clé/valeur dans le ConcurrentDictionary<TKey,TValue> en utilisant la fonction spécifiée si la clé existe déjà. |
AddOrUpdate<TArg>(TKey, Func<TKey,TArg,TValue>, Func<TKey,TValue,TArg,TValue>, TArg) |
Utilise l’argument et les fonctions spécifiés pour ajouter une paire clé/valeur au ConcurrentDictionary<TKey,TValue> si la clé n'existe pas déjà, ou pour mettre à jour une paire clé/valeur dans le ConcurrentDictionary<TKey,TValue> en utilisant la fonction spécifiée si la clé existe déjà. |
Exemples
L’exemple suivant montre comment appeler la AddOrUpdate méthode :
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);
}
}
// Demonstrates:
// ConcurrentDictionary<TKey, TValue>.AddOrUpdate()
// ConcurrentDictionary<TKey, TValue>.GetOrAdd()
// ConcurrentDictionary<TKey, TValue>[]
// Construct a ConcurrentDictionary
let cd = ConcurrentDictionary<int, int>()
// Bombard the ConcurrentDictionary with 10000 competing AddOrUpdates
Parallel.For(
0,
10000,
fun i ->
// Initial call will set cd[1] = 1.
// Ensuing calls will set cd[1] = cd[1] + 1
cd.AddOrUpdate(1, 1, (fun key oldValue -> oldValue + 1)) |> ignore
)
|> ignore
printfn $"After 10000 AddOrUpdates, cd[1] = {cd[1]}, should be 10000"
// Should return 100, as key 2 is not yet in the dictionary
let value = cd.GetOrAdd(2, (fun key -> 100))
printfn $"After initial GetOrAdd, cd[2] = {value} (should be 100)"
// Should return 100, as key 2 is already set to that value2
let value2 = cd.GetOrAdd(2, 10000)
printfn $"After second GetOrAdd, cd[2] = {value2} (should be 100)"
' 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
AddOrUpdate(TKey, Func<TKey,TValue>, Func<TKey,TValue,TValue>)
- Source:
- ConcurrentDictionary.cs
- Source:
- ConcurrentDictionary.cs
- Source:
- ConcurrentDictionary.cs
Utilise les fonctions spécifiées pour ajouter une paire clé/valeur au ConcurrentDictionary<TKey,TValue> si la clé n'existe pas déjà, ou pour mettre à jour une paire clé/valeur dans le ConcurrentDictionary<TKey,TValue> en utilisant la fonction spécifiée si la clé existe déjà.
public:
TValue AddOrUpdate(TKey key, Func<TKey, TValue> ^ addValueFactory, Func<TKey, TValue, TValue> ^ updateValueFactory);
public TValue AddOrUpdate (TKey key, Func<TKey,TValue> addValueFactory, Func<TKey,TValue,TValue> updateValueFactory);
member this.AddOrUpdate : 'Key * Func<'Key, 'Value> * Func<'Key, 'Value, 'Value> -> 'Value
Public Function AddOrUpdate (key As TKey, addValueFactory As Func(Of TKey, TValue), updateValueFactory As Func(Of TKey, TValue, TValue)) As TValue
Paramètres
- key
- TKey
Clé à ajouter ou dont la valeur doit être mise à jour.
- addValueFactory
- Func<TKey,TValue>
Fonction utilisée pour générer une valeur pour une clé absente.
- updateValueFactory
- Func<TKey,TValue,TValue>
Fonction utilisée pour générer une nouvelle valeur pour une clé existante en fonction de la valeur existante de la clé.
Retours
Nouvelle valeur pour la clé. Il s’agit soit du résultat de addValueFactory
(si la clé était absente), soit du résultat de updateValueFactory
(si la clé était présente).
Exceptions
key
, addValueFactory
ou updateValueFactory
est null
.
Le dictionnaire contient trop d’éléments.
Remarques
Si vous appelez AddOrUpdate simultanément sur différents threads, addValueFactory
vous pouvez être appelé plusieurs fois, mais sa paire clé/valeur peut ne pas être ajoutée au dictionnaire pour chaque appel.
Pour les modifications et les opérations d’écriture dans le dictionnaire, ConcurrentDictionary<TKey,TValue> utilise un verrouillage affiné pour garantir la sécurité des threads (les opérations de lecture sur le dictionnaire sont effectuées de manière non verrouillée). Les addValueFactory
délégués et updateValueFactory
peuvent être exécutés plusieurs fois pour vérifier que la valeur a été ajoutée ou mise à jour comme prévu. Toutefois, ils sont appelés en dehors des verrous pour éviter les problèmes qui peuvent survenir lors de l’exécution de code inconnu sous un verrou. Par conséquent, AddOrUpdate n’est pas atomique en ce qui concerne toutes les autres opérations sur la ConcurrentDictionary<TKey,TValue> classe.
Voir aussi
- Collections thread-safe
- Guide pratique pour ajouter et supprimer des éléments d'un ConcurrentDictionary
S’applique à
AddOrUpdate(TKey, TValue, Func<TKey,TValue,TValue>)
- Source:
- ConcurrentDictionary.cs
- Source:
- ConcurrentDictionary.cs
- Source:
- ConcurrentDictionary.cs
Ajoute une paire clé/valeur au ConcurrentDictionary<TKey,TValue> si la clé n'existe pas déjà, ou met à jour une paire clé/valeur dans le ConcurrentDictionary<TKey,TValue> en utilisant la fonction spécifiée si la clé existe déjà.
public:
TValue AddOrUpdate(TKey key, TValue addValue, Func<TKey, TValue, TValue> ^ updateValueFactory);
public TValue AddOrUpdate (TKey key, TValue addValue, Func<TKey,TValue,TValue> updateValueFactory);
member this.AddOrUpdate : 'Key * 'Value * Func<'Key, 'Value, 'Value> -> 'Value
Public Function AddOrUpdate (key As TKey, addValue As TValue, updateValueFactory As Func(Of TKey, TValue, TValue)) As TValue
Paramètres
- key
- TKey
Clé à ajouter ou dont la valeur doit être mise à jour.
- addValue
- TValue
Valeur à ajouter pour une clé absente.
- updateValueFactory
- Func<TKey,TValue,TValue>
Fonction utilisée pour générer une nouvelle valeur pour une clé existante en fonction de la valeur existante de la clé.
Retours
Nouvelle valeur pour la clé. Il s’agit soit du résultat de addValue
(si la clé était absente), soit du résultat de updateValueFactory
(si la clé était présente).
Exceptions
key
ou updateValueFactory
est null
.
Le dictionnaire contient trop d’éléments.
Exemples
L’exemple de code suivant montre comment initialiser un ConcurrentDictionary<TKey,TValue> et comment utiliser la méthode AddOrUpdate pour ajouter un élément supplémentaire à la collection et mettre à jour les éléments existants.
using System;
using System.Collections.Concurrent;
class CD_Ctor
{
// Demonstrates:
// ConcurrentDictionary<TKey, TValue> ctor(concurrencyLevel, initialCapacity)
// ConcurrentDictionary<TKey, TValue>[TKey]
static void Main()
{
// We know how many items we want to insert into the ConcurrentDictionary.
// So set the initial capacity to some prime number above that, to ensure that
// the ConcurrentDictionary does not need to be resized while initializing it.
int HIGHNUMBER = 64;
int initialCapacity = 101;
// The higher the concurrencyLevel, the higher the theoretical number of operations
// that could be performed concurrently on the ConcurrentDictionary. However, global
// operations like resizing the dictionary take longer as the concurrencyLevel rises.
// For the purposes of this example, we'll compromise at numCores * 2.
int numProcs = Environment.ProcessorCount;
int concurrencyLevel = numProcs * 2;
// Construct the dictionary with the desired concurrencyLevel and initialCapacity
ConcurrentDictionary<int, int> cd = new ConcurrentDictionary<int, int>(concurrencyLevel, initialCapacity);
// Initialize the dictionary
for (int i = 1; i <= HIGHNUMBER; i++) cd[i] = i * i;
Console.WriteLine("The square of 23 is {0} (should be {1})", cd[23], 23 * 23);
// Now iterate through, adding one to the end of the list. Existing items should be updated to be divided by their
// key and a new item will be added that is the square of its key.
for (int i = 1; i <= HIGHNUMBER + 1; i++)
cd.AddOrUpdate(i, i * i, (k,v) => v / i);
Console.WriteLine("The square root of 529 is {0} (should be {1})", cd[23], 529 / 23);
Console.WriteLine("The square of 65 is {0} (should be {1})", cd[HIGHNUMBER + 1], ((HIGHNUMBER + 1) * (HIGHNUMBER + 1)));
}
}
open System
open System.Collections.Concurrent
// Demonstrates:
// ConcurrentDictionary<TKey, TValue> ctor(concurrencyLevel, initialCapacity)
// ConcurrentDictionary<TKey, TValue>[TKey]
// We know how many items we want to insert into the ConcurrentDictionary.
// So set the initial capacity to some prime number above that, to ensure that
// the ConcurrentDictionary does not need to be resized while initializing it.
let HIGHNUMBER = 64
let initialCapacity = 101
// The higher the concurrencyLevel, the higher the theoretical number of operations
// that could be performed concurrently on the ConcurrentDictionary. However, global
// operations like resizing the dictionary take longer as the concurrencyLevel rises.
// For the purposes of this example, we'll compromise at numCores * 2.
let numProcs = Environment.ProcessorCount
let concurrencyLevel = numProcs * 2
// Construct the dictionary with the desired concurrencyLevel and initialCapacity
let cd = ConcurrentDictionary<int, int>(concurrencyLevel, initialCapacity)
// Initialize the dictionary
for i = 1 to HIGHNUMBER do
cd[i] <- i * i
printfn $"The square of 23 is {cd[23]} (should be {23 * 23})"
// Now iterate through, adding one to the end of the list. Existing items should be updated to be divided by their
// key and a new item will be added that is the square of its key.
for i = 1 to HIGHNUMBER + 1 do
cd.AddOrUpdate(i, i * i, (fun k v -> v / i)) |> ignore
printfn $"The square root of 529 is {cd[23]} (should be {529 / 23})"
printfn $"The square of 65 is {cd[HIGHNUMBER + 1]} (should be {(HIGHNUMBER + 1) * (HIGHNUMBER + 1)})"
Imports System.Collections.Concurrent
Class CD_Ctor
' Demonstrates:
' ConcurrentDictionary<TKey, TValue> ctor(concurrencyLevel, initialCapacity)
' ConcurrentDictionary<TKey, TValue>[TKey]
Public Shared Sub Main()
' We know how many items we want to insert into the ConcurrentDictionary.
' So set the initial capacity to some prime number above that, to ensure that
' the ConcurrentDictionary does not need to be resized while initializing it.
Dim HIGHNUMBER As Integer = 64
Dim initialCapacity As Integer = 101
' The higher the concurrencyLevel, the higher the theoretical number of operations
' that could be performed concurrently on the ConcurrentDictionary. However, global
' operations like resizing the dictionary take longer as the concurrencyLevel rises.
' For the purposes of this example, we'll compromise at numCores * 2.
Dim numProcs As Integer = Environment.ProcessorCount
Dim concurrencyLevel As Integer = numProcs * 2
' Construct the dictionary with the desired concurrencyLevel and initialCapacity
Dim cd As New ConcurrentDictionary(Of Integer, Integer)(concurrencyLevel, initialCapacity)
' Initialize the dictionary
For i As Integer = 1 To HIGHNUMBER
cd(i) = i * i
Next
Console.WriteLine("The square of 23 is {0} (should be {1})", cd(23), 23 * 23)
' Now iterate through, adding one to the end of the list. Existing items should be updated to be divided by their
' key and a new item will be added that is the square of its key.
For i As Integer = 1 To HIGHNUMBER + 1
cd.AddOrUpdate(i, i * i, Function(k, v)
Return v / i
End Function)
Next
Console.WriteLine("The square root of 529 is {0} (should be {1})", cd(23), 529 / 23)
Console.WriteLine("The square of 65 is {0} (should be {1})", cd(HIGHNUMBER + 1), ((HIGHNUMBER + 1) * (HIGHNUMBER + 1)))
End Sub
End Class
Pour les modifications et les opérations d’écriture dans le dictionnaire, ConcurrentDictionary<TKey,TValue> utilise un verrouillage affiné pour garantir la sécurité des threads. (Les opérations de lecture sur le dictionnaire sont effectuées de manière non verrouillée.) Les addValueFactory
délégués et updateValueFactory
peuvent être exécutés plusieurs fois pour vérifier que la valeur a été ajoutée ou mise à jour comme prévu. Toutefois, ils sont appelés en dehors des verrous pour éviter les problèmes qui peuvent survenir lors de l’exécution de code inconnu sous un verrou. Par conséquent, AddOrUpdate n’est pas atomique en ce qui concerne toutes les autres opérations sur la ConcurrentDictionary<TKey,TValue> classe.
Voir aussi
- Collections thread-safe
- Guide pratique pour ajouter et supprimer des éléments d'un ConcurrentDictionary
S’applique à
AddOrUpdate<TArg>(TKey, Func<TKey,TArg,TValue>, Func<TKey,TValue,TArg,TValue>, TArg)
- Source:
- ConcurrentDictionary.cs
- Source:
- ConcurrentDictionary.cs
- Source:
- ConcurrentDictionary.cs
Utilise l’argument et les fonctions spécifiés pour ajouter une paire clé/valeur au ConcurrentDictionary<TKey,TValue> si la clé n'existe pas déjà, ou pour mettre à jour une paire clé/valeur dans le ConcurrentDictionary<TKey,TValue> en utilisant la fonction spécifiée si la clé existe déjà.
public:
generic <typename TArg>
TValue AddOrUpdate(TKey key, Func<TKey, TArg, TValue> ^ addValueFactory, Func<TKey, TValue, TArg, TValue> ^ updateValueFactory, TArg factoryArgument);
public TValue AddOrUpdate<TArg> (TKey key, Func<TKey,TArg,TValue> addValueFactory, Func<TKey,TValue,TArg,TValue> updateValueFactory, TArg factoryArgument);
member this.AddOrUpdate : 'Key * Func<'Key, 'Arg, 'Value> * Func<'Key, 'Value, 'Arg, 'Value> * 'Arg -> 'Value
Public Function AddOrUpdate(Of TArg) (key As TKey, addValueFactory As Func(Of TKey, TArg, TValue), updateValueFactory As Func(Of TKey, TValue, TArg, TValue), factoryArgument As TArg) As TValue
Paramètres de type
- TArg
Type d’un argument à passer dans addValueFactory
et updateValueFactory
.
Paramètres
- key
- TKey
Clé à ajouter ou dont la valeur doit être mise à jour.
- addValueFactory
- Func<TKey,TArg,TValue>
Fonction utilisée pour générer une valeur pour une clé absente.
- updateValueFactory
- Func<TKey,TValue,TArg,TValue>
Fonction utilisée pour générer une nouvelle valeur pour une clé existante en fonction de la valeur existante de la clé.
- factoryArgument
- TArg
Argument à passer dans addValueFactory
et updateValueFactory
.
Retours
Nouvelle valeur pour la clé. Il s’agit soit du résultat de addValueFactory
(si la clé était absente), soit du résultat de updateValueFactory
(si la clé était présente).
Exceptions
key
, addValueFactory
ou updateValueFactory
est une référence Null (Nothing en Visual Basic).
Le dictionnaire contient trop d’éléments.
Remarques
Si vous appelez AddOrUpdate simultanément sur différents threads, addValueFactory
vous pouvez être appelé plusieurs fois, mais sa paire clé/valeur peut ne pas être ajoutée au dictionnaire pour chaque appel.
Pour les modifications et les opérations d’écriture dans le dictionnaire, ConcurrentDictionary<TKey,TValue> utilise un verrouillage affiné pour garantir la sécurité des threads. (Les opérations de lecture sur le dictionnaire sont effectuées de manière non verrouillée.) Les addValueFactory
délégués et updateValueFactory
peuvent être exécutés plusieurs fois pour vérifier que la valeur a été ajoutée ou mise à jour comme prévu. Toutefois, ils sont appelés en dehors des verrous pour éviter les problèmes qui peuvent survenir lors de l’exécution de code inconnu sous un verrou. Par conséquent, AddOrUpdate n’est pas atomique en ce qui concerne toutes les autres opérations sur la ConcurrentDictionary<TKey,TValue> classe.