ConcurrentDictionary<TKey,TValue>.GetOrAdd Metoda
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Dodaje parę klucz/wartość do ConcurrentDictionary<TKey,TValue> elementu , jeśli klucz jeszcze nie istnieje. Zwraca nową wartość lub istniejącą wartość, jeśli klucz już istnieje.
Przeciążenia
GetOrAdd(TKey, Func<TKey,TValue>) |
Dodaje parę klucz/wartość do ConcurrentDictionary<TKey,TValue> elementu przy użyciu określonej funkcji, jeśli klucz jeszcze nie istnieje. Zwraca nową wartość lub istniejącą wartość, jeśli klucz istnieje. |
GetOrAdd(TKey, TValue) |
Dodaje parę klucz/wartość do ConcurrentDictionary<TKey,TValue> elementu , jeśli klucz jeszcze nie istnieje. Zwraca nową wartość lub istniejącą wartość, jeśli klucz istnieje. |
GetOrAdd<TArg>(TKey, Func<TKey,TArg,TValue>, TArg) |
Dodaje parę klucz/wartość do ConcurrentDictionary<TKey,TValue> klasy przy użyciu określonej funkcji i argumentu, jeśli klucz jeszcze nie istnieje, lub zwraca istniejącą wartość, jeśli klucz istnieje. |
Przykłady
W poniższym przykładzie pokazano, jak wywołać metodę GetOrAdd :
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
GetOrAdd(TKey, Func<TKey,TValue>)
- Źródło:
- ConcurrentDictionary.cs
- Źródło:
- ConcurrentDictionary.cs
- Źródło:
- ConcurrentDictionary.cs
Dodaje parę klucz/wartość do ConcurrentDictionary<TKey,TValue> elementu przy użyciu określonej funkcji, jeśli klucz jeszcze nie istnieje. Zwraca nową wartość lub istniejącą wartość, jeśli klucz istnieje.
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
Parametry
- key
- TKey
Klucz elementu do dodania.
- valueFactory
- Func<TKey,TValue>
Funkcja używana do generowania wartości klucza.
Zwraca
Wartość klucza. Będzie to istniejąca wartość klucza, jeśli klucz znajduje się już w słowniku, lub nową wartość, jeśli klucz nie znajdował się w słowniku.
Wyjątki
key
lub valueFactory
to null
.
Słownik zawiera zbyt wiele elementów.
Uwagi
W przypadku modyfikacji i operacji zapisu w słowniku używa precyzyjnego blokowania w ConcurrentDictionary<TKey,TValue> celu zapewnienia bezpieczeństwa wątków. (Operacje odczytu w słowniku są wykonywane w sposób wolny od blokady). Jednak delegat jest wywoływany poza blokadami, valueFactory
aby uniknąć problemów, które mogą wystąpić podczas wykonywania nieznanego kodu pod blokadą. GetOrAdd W związku z tym nie jest niepodzielna w odniesieniu do wszystkich innych operacji w ConcurrentDictionary<TKey,TValue> klasie.
Ponieważ klucz/wartość można wstawić przez inny wątek podczas valueFactory
generowania wartości, nie można ufać, że tylko dlatego valueFactory
, że wykonane, jego wygenerowana wartość zostanie wstawiona do słownika i zwrócona. Jeśli wywołasz jednocześnie GetOrAdd różne wątki, może być wywoływana wiele razy, valueFactory
ale do słownika zostanie dodana tylko jedna para klucz/wartość.
Wartość zwracana zależy od obecności klucza w słowniku i tego, czy klucz/wartość jest wstawiany przez inny wątek po GetOrAdd wywołaniu, ale przed valueFactory
wygenerowaniem wartości:
Scenariusz | Wartość zwracana |
---|---|
Klucz znajduje się już w słowniku. | Zwracana jest istniejąca wartość. |
Klucz nie znajduje się w słowniku. valueFactory generuje wartość. Po ponownym zaznaczeniu klucza nie znaleziono klucza. |
Klucz/wartość jest wstawiany do słownika, a wartość jest zwracana. |
Klucz nie znajduje się w słowniku. valueFactory generuje wartość. Podczas valueFactory generowania wartości inny wątek wstawia wartość klucza. Po valueFactory wykonaniu i ponownym zaznaczeniu klucza zostanie znaleziony klucz wstawiony przez inny wątek. |
Zwracana jest wartość wstawiona przez inny wątek. |
Zobacz też
- Kolekcje bezpieczne wątkowo
- Instrukcje: Dodawanie elementów do kolekcji ConcurrentDictionary i ich usuwanie
Dotyczy
GetOrAdd(TKey, TValue)
- Źródło:
- ConcurrentDictionary.cs
- Źródło:
- ConcurrentDictionary.cs
- Źródło:
- ConcurrentDictionary.cs
Dodaje parę klucz/wartość do ConcurrentDictionary<TKey,TValue> elementu , jeśli klucz jeszcze nie istnieje. Zwraca nową wartość lub istniejącą wartość, jeśli klucz istnieje.
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
Parametry
- key
- TKey
Klucz elementu do dodania.
- value
- TValue
Wartość do dodania, jeśli klucz jeszcze nie istnieje.
Zwraca
Wartość klucza. Będzie to istniejąca wartość klucza, jeśli klucz znajduje się już w słowniku, lub nową wartość, jeśli klucz nie znajdował się w słowniku.
Wyjątki
key
to null
.
Słownik zawiera zbyt wiele elementów.
Zobacz też
- Kolekcje bezpieczne wątkowo
- Instrukcje: Dodawanie elementów do kolekcji ConcurrentDictionary i ich usuwanie
Dotyczy
GetOrAdd<TArg>(TKey, Func<TKey,TArg,TValue>, TArg)
- Źródło:
- ConcurrentDictionary.cs
- Źródło:
- ConcurrentDictionary.cs
- Źródło:
- ConcurrentDictionary.cs
Dodaje parę klucz/wartość do ConcurrentDictionary<TKey,TValue> klasy przy użyciu określonej funkcji i argumentu, jeśli klucz jeszcze nie istnieje, lub zwraca istniejącą wartość, jeśli klucz istnieje.
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
Parametry typu
- TArg
Typ argumentu, który ma być przekazywany do valueFactory
elementu .
Parametry
- key
- TKey
Klucz elementu do dodania.
- valueFactory
- Func<TKey,TArg,TValue>
Funkcja używana do generowania wartości klucza.
- factoryArgument
- TArg
Wartość argumentu, która ma być przekazywana do valueFactory
elementu .
Zwraca
Wartość klucza. Będzie to istniejąca wartość klucza, jeśli klucz znajduje się już w słowniku, lub nową wartość, jeśli klucz nie znajdował się w słowniku.
Wyjątki
key
jest odwołaniem null
(Nic w Visual Basic).
Słownik zawiera zbyt wiele elementów.
Uwagi
W przypadku modyfikacji i operacji zapisu w słowniku używa precyzyjnego blokowania w ConcurrentDictionary<TKey,TValue> celu zapewnienia bezpieczeństwa wątków. (Operacje odczytu w słowniku są wykonywane w sposób wolny od blokady). Jednak delegat jest wywoływany poza blokadami, valueFactory
aby uniknąć problemów, które mogą wystąpić podczas wykonywania nieznanego kodu pod blokadą. GetOrAdd W związku z tym nie jest niepodzielna w odniesieniu do wszystkich innych operacji w ConcurrentDictionary<TKey,TValue> klasie.
Ponieważ klucz/wartość można wstawić przez inny wątek podczas valueFactory
generowania wartości, nie można ufać, że tylko dlatego valueFactory
, że wykonane, jego wygenerowana wartość zostanie wstawiona do słownika i zwrócona. Jeśli wywołasz jednocześnie GetOrAdd różne wątki, może być wywoływana wiele razy, valueFactory
ale do słownika zostanie dodana tylko jedna para klucz/wartość.
Wartość zwracana zależy od obecności klucza w słowniku i tego, czy klucz/wartość jest wstawiany przez inny wątek po GetOrAdd wywołaniu, ale przed valueFactory
wygenerowaniem wartości:
Scenariusz | Wartość zwracana |
---|---|
Klucz znajduje się już w słowniku. | Zwracana jest istniejąca wartość. |
Klucz nie znajduje się w słowniku. valueFactory generuje wartość. Po ponownym zaznaczeniu klucza nie znaleziono klucza. |
Klucz/wartość jest wstawiany do słownika, a wartość jest zwracana. |
Klucz nie znajduje się w słowniku. valueFactory generuje wartość. Podczas valueFactory generowania wartości inny wątek wstawia wartość klucza. Po valueFactory wykonaniu i ponownym zaznaczeniu klucza zostanie znaleziony klucz wstawiony przez inny wątek. |
Zwracana jest wartość wstawiona przez inny wątek. |