ConcurrentDictionary<TKey,TValue>.GetOrAdd Methode
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
Fügt dem ConcurrentDictionary<TKey,TValue> ein Schlüssel-Wert-Paar hinzu, wenn der Schlüssel nicht bereits vorhanden ist. Gibt den neuen Wert oder den vorhandenen Wert zurück, wenn der Schlüssel bereits existiert.
Überlädt
GetOrAdd(TKey, Func<TKey,TValue>) |
Fügt dem ConcurrentDictionary<TKey,TValue> ein Schlüssel/Wert-Paar mithilfe der angegebenen Funktion hinzu, wenn der Schlüssel noch nicht vorhanden ist. Gibt den neuen Wert oder den vorhandenen Wert zurück, wenn der Schlüssel existiert. |
GetOrAdd(TKey, TValue) |
Fügt dem ConcurrentDictionary<TKey,TValue> ein Schlüssel-Wert-Paar hinzu, wenn der Schlüssel nicht bereits vorhanden ist. Gibt den neuen Wert oder den vorhandenen Wert zurück, wenn der Schlüssel existiert. |
GetOrAdd<TArg>(TKey, Func<TKey,TArg,TValue>, TArg) |
Fügt dem ConcurrentDictionary<TKey,TValue> mithilfe der angegebenen Funktion und eines Arguments ein Schlüssel-Wert-Paar hinzu, wenn der Schlüssel noch nicht vorhanden ist, oder gibt den vorhanden Wert zurück, wenn der Schlüssel vorhanden ist. |
Beispiele
Im folgenden Beispiel wird gezeigt, wie Sie die GetOrAdd Methode aufrufen:
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>)
Fügt dem ConcurrentDictionary<TKey,TValue> ein Schlüssel/Wert-Paar mithilfe der angegebenen Funktion hinzu, wenn der Schlüssel noch nicht vorhanden ist. Gibt den neuen Wert oder den vorhandenen Wert zurück, wenn der Schlüssel existiert.
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
Parameter
- key
- TKey
Der Schlüssel des hinzuzufügenden Elements.
- valueFactory
- Func<TKey,TValue>
Die Funktion, mit der ein Wert für den Schlüssel generiert wird.
Gibt zurück
- TValue
Der Wert für den Schlüssel. Dies ist entweder der vorhandene Wert für den Schlüssel, wenn der Schlüssel bereits im Wörterbuch vorhanden ist, oder der neue Wert, wenn der Schlüssel nicht im Wörterbuch vorhanden war.
Ausnahmen
key
oder valueFactory
ist null
.
Das Wörterbuch enthält zu viele Elemente.
Hinweise
Bei Änderungen und Schreibvorgängen im Wörterbuch wird die Feinkornsperre verwendet, ConcurrentDictionary<TKey,TValue> um die Threadsicherheit zu gewährleisten. (Lesevorgänge im Wörterbuch werden auf sperrfreie Weise ausgeführt.) Der valueFactory
Stellvertretung wird jedoch außerhalb der Sperren aufgerufen, um die Probleme zu vermeiden, die sich aus dem Ausführen unbekannter Codes unter einer Sperre ergeben können. GetOrAdd Daher ist es nicht atomiert in Bezug auf alle anderen Vorgänge auf der ConcurrentDictionary<TKey,TValue> Klasse.
Da ein Schlüssel/Wert von einem anderen Thread eingefügt werden kann, während valueFactory
ein Wert generiert wird, können Sie nicht vertrauen, dass nur aufgrund valueFactory
der Ausführung der erzeugten Wert in das Wörterbuch eingefügt und zurückgegeben wird. Wenn Sie gleichzeitig auf verschiedenen Threads aufrufen GetOrAdd , wird möglicherweise mehrmals aufgerufen, valueFactory
aber nur ein Schlüssel-/Wertpaar wird dem Wörterbuch hinzugefügt.
Der Rückgabewert hängt von der Anwesenheit des Schlüssels im Wörterbuch ab und ob ein Schlüssel/Wert von einem anderen Thread eingefügt wird, GetOrAdd bevor valueFactory
ein Wert generiert wird:
Szenario | Rückgabewert |
---|---|
Der Schlüssel befindet sich bereits im Wörterbuch. | Der vorhandene Wert wird zurückgegeben. |
Der Schlüssel befindet sich nicht im Wörterbuch. valueFactory generiert einen Wert. Beim Erneuten Überprüfen auf den Schlüssel wird kein Schlüssel gefunden. |
Der Schlüssel/Wert wird in das Wörterbuch eingefügt, und der Wert wird zurückgegeben. |
Der Schlüssel befindet sich nicht im Wörterbuch. valueFactory generiert einen Wert. Beim valueFactory Generieren des Werts fügt ein anderer Thread einen Wert für den Schlüssel ein. Nach valueFactory dem Ausführen und erneuten Überprüfen auf den Schlüssel wird der durch den anderen Thread eingefügte Schlüssel gefunden. |
Der vom anderen Thread eingefügte Wert wird zurückgegeben. |
Siehe auch
- Threadsichere Auflistungen
- Vorgehensweise: Hinzufügen und Entfernen von Elementen aus einer ConcurrentDictionary-Klasse
Gilt für
GetOrAdd(TKey, TValue)
Fügt dem ConcurrentDictionary<TKey,TValue> ein Schlüssel-Wert-Paar hinzu, wenn der Schlüssel nicht bereits vorhanden ist. Gibt den neuen Wert oder den vorhandenen Wert zurück, wenn der Schlüssel existiert.
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
Parameter
- key
- TKey
Der Schlüssel des hinzuzufügenden Elements.
- value
- TValue
Der hinzuzufügende Wert, wenn der Schlüssel nicht bereits vorhanden ist.
Gibt zurück
- TValue
Der Wert für den Schlüssel. Dies ist entweder der vorhandene Wert für den Schlüssel, wenn der Schlüssel bereits im Wörterbuch vorhanden ist, oder der neue Wert, wenn der Schlüssel nicht im Wörterbuch vorhanden war.
Ausnahmen
key
ist null
.
Das Wörterbuch enthält zu viele Elemente.
Siehe auch
- Threadsichere Auflistungen
- Vorgehensweise: Hinzufügen und Entfernen von Elementen aus einer ConcurrentDictionary-Klasse
Gilt für
GetOrAdd<TArg>(TKey, Func<TKey,TArg,TValue>, TArg)
Fügt dem ConcurrentDictionary<TKey,TValue> mithilfe der angegebenen Funktion und eines Arguments ein Schlüssel-Wert-Paar hinzu, wenn der Schlüssel noch nicht vorhanden ist, oder gibt den vorhanden Wert zurück, wenn der Schlüssel vorhanden ist.
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
Typparameter
- TArg
Der Typ eines zu übergebenden valueFactory
Arguments.
Parameter
- key
- TKey
Der Schlüssel des hinzuzufügenden Elements.
- valueFactory
- Func<TKey,TArg,TValue>
Die Funktion, mit der ein Wert für den Schlüssel generiert wird.
- factoryArgument
- TArg
Ein Argumentwert, der an valueFactory
übergeben werden soll.
Gibt zurück
- TValue
Der Wert für den Schlüssel. Dies ist entweder der vorhandene Wert für den Schlüssel, wenn der Schlüssel bereits im Wörterbuch vorhanden ist, oder der neue Wert, wenn der Schlüssel nicht im Wörterbuch vorhanden war.
Ausnahmen
key
ist ein null
-Verweis („Nothing“ in Visual Basic).
Das Wörterbuch enthält zu viele Elemente.
Hinweise
Bei Änderungen und Schreibvorgängen in das Wörterbuch ConcurrentDictionary<TKey,TValue> verwendet die feinkörnige Sperre, um die Threadsicherheit zu gewährleisten. (Lesevorgänge im Wörterbuch werden auf sperrfreie Weise ausgeführt.) Die valueFactory
Stellvertretung wird jedoch außerhalb der Sperren aufgerufen, um die Probleme zu vermeiden, die sich aus dem Ausführen unbekannter Codes unter einer Sperre ergeben können. GetOrAdd Daher ist es nicht Atom bei allen anderen Vorgängen der ConcurrentDictionary<TKey,TValue> Klasse.
Da ein Schlüssel/Wert von einem anderen Thread eingefügt werden kann, während valueFactory
ein Wert generiert wird, können Sie nicht vertrauen, dass valueFactory
nur aufgrund der Ausführung dessen erzeugter Wert in das Wörterbuch eingefügt und zurückgegeben wird. Wenn Sie gleichzeitig verschiedene Threads aufrufen GetOrAdd , wird möglicherweise mehrmals aufgerufen, valueFactory
aber nur ein Schlüssel-Wert-Paar wird dem Wörterbuch hinzugefügt.
Der Rückgabewert hängt von der Anwesenheit des Schlüssels im Wörterbuch ab und gibt an, ob ein Schlüssel/Wert von einem anderen Thread eingefügt wird, GetOrAdd nachdem er aufgerufen wurde, aber bevor valueFactory
ein Wert generiert wird:
Szenario | Rückgabewert |
---|---|
Der Schlüssel befindet sich bereits im Wörterbuch. | Der vorhandene Wert wird zurückgegeben. |
Der Schlüssel befindet sich nicht im Wörterbuch. valueFactory generiert einen Wert. Beim erneuten Überprüfen auf die Taste wird kein Schlüssel gefunden. |
Der Schlüssel/Wert wird in das Wörterbuch eingefügt, und der Wert wird zurückgegeben. |
Der Schlüssel befindet sich nicht im Wörterbuch. valueFactory generiert einen Wert. Beim valueFactory Generieren des Werts fügt ein anderer Thread einen Wert für den Schlüssel ein. Nachdem valueFactory sie ausgeführt und erneut auf den Schlüssel überprüft wurde, wird der durch den anderen Thread eingefügte Schlüssel gefunden. |
Der vom anderen Thread eingefügte Wert wird zurückgegeben. |