ConcurrentDictionary<TKey,TValue>.AddOrUpdate Metoda
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Přidá pár klíč/hodnota k ConcurrentDictionary<TKey,TValue> klíči, pokud klíč ještě neexistuje, nebo aktualizuje dvojici klíč/hodnota v ConcurrentDictionary<TKey,TValue> případě, že klíč již existuje.
Přetížení
| Name | Description |
|---|---|
| AddOrUpdate(TKey, Func<TKey,TValue>, Func<TKey,TValue,TValue>) |
Použije zadané funkce k přidání páru klíč/hodnota k ConcurrentDictionary<TKey,TValue> klíči, pokud klíč ještě neexistuje, nebo k aktualizaci páru klíč/hodnota v ConcurrentDictionary<TKey,TValue> případě, že klíč již existuje. |
| AddOrUpdate(TKey, TValue, Func<TKey,TValue,TValue>) |
Přidá pár klíč/hodnota k ConcurrentDictionary<TKey,TValue> klíči, pokud klíč ještě neexistuje, nebo aktualizuje dvojici klíč/hodnota v ConcurrentDictionary<TKey,TValue> zadané funkci, pokud klíč již existuje. |
| AddOrUpdate<TArg>(TKey, Func<TKey,TArg,TValue>, Func<TKey,TValue,TArg,TValue>, TArg) |
Použije zadané funkce a argument k přidání páru klíč/hodnota k ConcurrentDictionary<TKey,TValue> klíči, pokud klíč ještě neexistuje, nebo k aktualizaci páru ConcurrentDictionary<TKey,TValue> klíč/hodnota v případě, že klíč již existuje. |
Příklady
Následující příklad ukazuje, jak volat metodu AddOrUpdate :
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>)
- Zdroj:
- ConcurrentDictionary.cs
- Zdroj:
- ConcurrentDictionary.cs
- Zdroj:
- ConcurrentDictionary.cs
- Zdroj:
- ConcurrentDictionary.cs
- Zdroj:
- ConcurrentDictionary.cs
Použije zadané funkce k přidání páru klíč/hodnota k ConcurrentDictionary<TKey,TValue> klíči, pokud klíč ještě neexistuje, nebo k aktualizaci páru klíč/hodnota v ConcurrentDictionary<TKey,TValue> případě, že klíč již existuje.
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
Parametry
- key
- TKey
Klíč, který se má přidat nebo jehož hodnota by se měla aktualizovat.
- addValueFactory
- Func<TKey,TValue>
Funkce použitá k vygenerování hodnoty chybějícího klíče.
- updateValueFactory
- Func<TKey,TValue,TValue>
Funkce použitá k vygenerování nové hodnoty pro existující klíč na základě existující hodnoty klíče.
Návraty
Nová hodnota klíče. Bude to buď výsledek addValueFactory (pokud klíč chybí), nebo výsledek updateValueFactory (pokud byl klíč přítomen).
Výjimky
key, addValueFactorynebo updateValueFactory je null.
Slovník obsahuje příliš mnoho prvků.
Poznámky
Pokud voláte AddOrUpdate současně v různých vláknech, addValueFactory může se volat vícekrát, ale jeho pár klíč/hodnota nemusí být přidán do slovníku pro každé volání.
V případě úprav a operací zápisu do slovníku ConcurrentDictionary<TKey,TValue> se pomocí jemně odstupňovaného uzamčení zajistí bezpečnost vláken (operace čtení ve slovníku se provádějí bez uzamčení). Delegáti addValueFactory se updateValueFactory můžou spouštět vícekrát, aby se ověřilo, že se hodnota přidala nebo aktualizovala podle očekávání. Jsou však volány mimo zámky, aby se zabránilo problémům, které mohou vzniknout při spouštění neznámého kódu pod zámkem.
AddOrUpdate Proto není atomický s ohledem na všechny ostatní operace třídyConcurrentDictionary<TKey,TValue>.
Viz také
Platí pro
AddOrUpdate(TKey, TValue, Func<TKey,TValue,TValue>)
- Zdroj:
- ConcurrentDictionary.cs
- Zdroj:
- ConcurrentDictionary.cs
- Zdroj:
- ConcurrentDictionary.cs
- Zdroj:
- ConcurrentDictionary.cs
- Zdroj:
- ConcurrentDictionary.cs
Přidá pár klíč/hodnota k ConcurrentDictionary<TKey,TValue> klíči, pokud klíč ještě neexistuje, nebo aktualizuje dvojici klíč/hodnota v ConcurrentDictionary<TKey,TValue> zadané funkci, pokud klíč již existuje.
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
Parametry
- key
- TKey
Klíč, který se má přidat nebo jehož hodnota by se měla aktualizovat.
- addValue
- TValue
Hodnota, která se má přidat pro chybějící klíč.
- updateValueFactory
- Func<TKey,TValue,TValue>
Funkce použitá k vygenerování nové hodnoty pro existující klíč na základě existující hodnoty klíče.
Návraty
Nová hodnota klíče. Bude to buď addValue (pokud klíč chybí), nebo výsledek updateValueFactory (pokud byl klíč k dispozici).
Výjimky
key nebo updateValueFactory je null.
Slovník obsahuje příliš mnoho prvků.
Příklady
Následující příklad kódu ukazuje, jak inicializovat ConcurrentDictionary<TKey,TValue> a jak použít AddOrUpdate metoda přidat další položku do kolekce a aktualizovat existující položky.
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
Pro úpravy a operace zápisu do slovníku ConcurrentDictionary<TKey,TValue> používá jemně odstupňované uzamykání k zajištění bezpečnosti vlákna. (Operace čtení ve slovníku se provádějí bez zámku.) Delegáti addValueFactory se updateValueFactory můžou spouštět vícekrát, aby se ověřilo, že se hodnota přidala nebo aktualizovala podle očekávání. Jsou však volány mimo zámky, aby se zabránilo problémům, které mohou vzniknout při spouštění neznámého kódu pod zámkem.
AddOrUpdate Proto není atomický s ohledem na všechny ostatní operace třídyConcurrentDictionary<TKey,TValue>.
Viz také
Platí pro
AddOrUpdate<TArg>(TKey, Func<TKey,TArg,TValue>, Func<TKey,TValue,TArg,TValue>, TArg)
- Zdroj:
- ConcurrentDictionary.cs
- Zdroj:
- ConcurrentDictionary.cs
- Zdroj:
- ConcurrentDictionary.cs
- Zdroj:
- ConcurrentDictionary.cs
- Zdroj:
- ConcurrentDictionary.cs
Použije zadané funkce a argument k přidání páru klíč/hodnota k ConcurrentDictionary<TKey,TValue> klíči, pokud klíč ještě neexistuje, nebo k aktualizaci páru ConcurrentDictionary<TKey,TValue> klíč/hodnota v případě, že klíč již existuje.
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) where TArg : allows ref struct;
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
Parametry typu
- TArg
Typ argumentu, který addValueFactory se má předat a updateValueFactory.
Parametry
- key
- TKey
Klíč, který se má přidat nebo jehož hodnota by se měla aktualizovat.
- addValueFactory
- Func<TKey,TArg,TValue>
Funkce použitá k vygenerování hodnoty chybějícího klíče.
- updateValueFactory
- Func<TKey,TValue,TArg,TValue>
Funkce použitá k vygenerování nové hodnoty pro existující klíč na základě existující hodnoty klíče.
- factoryArgument
- TArg
Argument, který addValueFactory se má předat a updateValueFactory.
Návraty
Nová hodnota klíče. Bude to buď výsledek addValueFactory (pokud klíč chybí), nebo výsledek updateValueFactory (pokud byl klíč přítomen).
Výjimky
key, addValueFactory nebo updateValueFactory je odkaz null (nic v Visual Basic).
Slovník obsahuje příliš mnoho prvků.
Poznámky
Pokud voláte AddOrUpdate současně v různých vláknech, addValueFactory může se volat vícekrát, ale jeho pár klíč/hodnota nemusí být přidán do slovníku pro každé volání.
Pro úpravy a operace zápisu do slovníku ConcurrentDictionary<TKey,TValue> používá jemně odstupňované uzamykání k zajištění bezpečnosti vlákna. (Operace čtení ve slovníku se provádějí bez zámku.) Delegáti addValueFactory se updateValueFactory můžou spouštět vícekrát, aby se ověřilo, že se hodnota přidala nebo aktualizovala podle očekávání. Jsou však volány mimo zámky, aby se zabránilo problémům, které mohou vzniknout při spouštění neznámého kódu pod zámkem.
AddOrUpdate Proto není atomický s ohledem na všechny ostatní operace třídyConcurrentDictionary<TKey,TValue>.