ConcurrentDictionary<TKey,TValue>.GetOrAdd Methode
Definitie
Belangrijk
Bepaalde informatie heeft betrekking op een voorlopige productversie die aanzienlijk kan worden gewijzigd voordat deze wordt uitgebracht. Microsoft biedt geen enkele expliciete of impliciete garanties met betrekking tot de informatie die hier wordt verstrekt.
Hiermee voegt u een sleutel/waardepaar toe aan de ConcurrentDictionary<TKey,TValue> sleutel als de sleutel nog niet bestaat. Retourneert de nieuwe waarde of de bestaande waarde als de sleutel al bestaat.
Overloads
| Name | Description |
|---|---|
| GetOrAdd(TKey, Func<TKey,TValue>) |
Hiermee voegt u een sleutel/waardepaar toe aan de ConcurrentDictionary<TKey,TValue> functie met behulp van de opgegeven functie als de sleutel nog niet bestaat. Retourneert de nieuwe waarde of de bestaande waarde als de sleutel bestaat. |
| GetOrAdd(TKey, TValue) |
Hiermee voegt u een sleutel/waardepaar toe aan de ConcurrentDictionary<TKey,TValue> sleutel als de sleutel nog niet bestaat. Retourneert de nieuwe waarde of de bestaande waarde als de sleutel bestaat. |
| GetOrAdd<TArg>(TKey, Func<TKey,TArg,TValue>, TArg) |
Hiermee voegt u een sleutel/waardepaar toe aan het ConcurrentDictionary<TKey,TValue> met behulp van de opgegeven functie en een argument als de sleutel nog niet bestaat of retourneert u de bestaande waarde als de sleutel bestaat. |
Voorbeelden
In het volgende voorbeeld ziet u hoe u de GetOrAdd methode aanroept:
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>)
Hiermee voegt u een sleutel/waardepaar toe aan de ConcurrentDictionary<TKey,TValue> functie met behulp van de opgegeven functie als de sleutel nog niet bestaat. Retourneert de nieuwe waarde of de bestaande waarde als de sleutel bestaat.
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
Parameters
- key
- TKey
De sleutel van het element dat moet worden toegevoegd.
- valueFactory
- Func<TKey,TValue>
De functie die wordt gebruikt om een waarde voor de sleutel te genereren.
Retouren
De waarde voor de sleutel. Dit is de bestaande waarde voor de sleutel als de sleutel zich al in de woordenlijst bevindt of de nieuwe waarde als de sleutel zich niet in de woordenlijst bevindt.
Uitzonderingen
key of valueFactory is null.
De woordenlijst bevat te veel elementen.
Opmerkingen
Voor wijzigingen en schrijfbewerkingen in de woordenlijst gebruikt ConcurrentDictionary<TKey,TValue> u fijnmazige vergrendeling om de veiligheid van threads te garanderen. (Leesbewerkingen in de woordenlijst worden op een vergrendelingsvrije manier uitgevoerd.) De valueFactory gemachtigde wordt echter buiten de vergrendelingen aangeroepen om te voorkomen dat er problemen optreden die kunnen ontstaan door het uitvoeren van onbekende code onder een vergrendeling.
GetOrAdd Daarom is het niet atomisch met betrekking tot alle andere bewerkingen op de ConcurrentDictionary<TKey,TValue> klasse.
Omdat een sleutel/waarde kan worden ingevoegd door een andere thread terwijl valueFactory een waarde wordt gegenereerd, kunt u niet vertrouwen dat alleen omdat valueFactory deze is uitgevoerd, de geproduceerde waarde wordt ingevoegd in de woordenlijst en geretourneerd. Als u tegelijk belt GetOrAdd op verschillende threads, kan het meerdere keren worden aangeroepen, valueFactory maar er wordt slechts één sleutel/waardepaar toegevoegd aan de woordenlijst.
De retourwaarde is afhankelijk van de aanwezigheid van de sleutel in de woordenlijst en of een sleutel/waarde wordt ingevoegd door een andere thread nadat GetOrAdd deze is aangeroepen, maar voordat valueFactory een waarde wordt gegenereerd:
| Scenario | Retourwaarde |
|---|---|
| De sleutel bevindt zich al in de woordenlijst. | De bestaande waarde wordt geretourneerd. |
De sleutel staat niet in de woordenlijst.
valueFactory genereert een waarde. Bij het opnieuw controleren van de sleutel is er geen sleutel gevonden. |
De sleutel/waarde wordt ingevoegd in de woordenlijst en de waarde wordt geretourneerd. |
De sleutel staat niet in de woordenlijst.
valueFactory genereert een waarde. Tijdens valueFactory het genereren van de waarde voegt een andere thread een waarde in voor de sleutel. Nadat valueFactory de sleutel is uitgevoerd en opnieuw is gecontroleerd, wordt de sleutel gevonden die door de andere thread is ingevoegd. |
De waarde die door de andere thread is ingevoegd, wordt geretourneerd. |
Zie ook
- Thread-Safe Verzamelingen
- Procedure: Items toevoegen aan en verwijderen uit een ConcurrentDictionary
Van toepassing op
GetOrAdd(TKey, TValue)
Hiermee voegt u een sleutel/waardepaar toe aan de ConcurrentDictionary<TKey,TValue> sleutel als de sleutel nog niet bestaat. Retourneert de nieuwe waarde of de bestaande waarde als de sleutel bestaat.
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
Parameters
- key
- TKey
De sleutel van het element dat moet worden toegevoegd.
- value
- TValue
De waarde die moet worden toegevoegd als de sleutel nog niet bestaat.
Retouren
De waarde voor de sleutel. Dit is de bestaande waarde voor de sleutel als de sleutel zich al in de woordenlijst bevindt of de nieuwe waarde als de sleutel zich niet in de woordenlijst bevindt.
Uitzonderingen
key is null.
De woordenlijst bevat te veel elementen.
Zie ook
- Thread-Safe Verzamelingen
- Procedure: Items toevoegen aan en verwijderen uit een ConcurrentDictionary
Van toepassing op
GetOrAdd<TArg>(TKey, Func<TKey,TArg,TValue>, TArg)
Hiermee voegt u een sleutel/waardepaar toe aan het ConcurrentDictionary<TKey,TValue> met behulp van de opgegeven functie en een argument als de sleutel nog niet bestaat of retourneert u de bestaande waarde als de sleutel bestaat.
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
Type parameters
- TArg
Het type argument dat moet worden doorgegeven aan valueFactory.
Parameters
- key
- TKey
De sleutel van het element dat moet worden toegevoegd.
- valueFactory
- Func<TKey,TArg,TValue>
De functie die wordt gebruikt om een waarde voor de sleutel te genereren.
- factoryArgument
- TArg
Een argumentwaarde die moet worden doorgegeven aan valueFactory.
Retouren
De waarde voor de sleutel. Dit is de bestaande waarde voor de sleutel als de sleutel zich al in de woordenlijst bevindt of de nieuwe waarde als de sleutel zich niet in de woordenlijst bevindt.
Uitzonderingen
key is een null verwijzing (niets in Visual Basic).
De woordenlijst bevat te veel elementen.
Opmerkingen
Voor wijzigingen en schrijfbewerkingen in de woordenlijst gebruikt ConcurrentDictionary<TKey,TValue> u fijnmazige vergrendeling om de veiligheid van threads te garanderen. (Leesbewerkingen in de woordenlijst worden op een vergrendelingsvrije manier uitgevoerd.) De valueFactory gemachtigde wordt echter buiten de vergrendelingen aangeroepen om te voorkomen dat er problemen optreden die kunnen ontstaan door het uitvoeren van onbekende code onder een vergrendeling.
GetOrAdd Daarom is het niet atomisch met betrekking tot alle andere bewerkingen op de ConcurrentDictionary<TKey,TValue> klasse.
Omdat een sleutel/waarde kan worden ingevoegd door een andere thread terwijl valueFactory een waarde wordt gegenereerd, kunt u niet vertrouwen dat alleen omdat valueFactory deze is uitgevoerd, de geproduceerde waarde wordt ingevoegd in de woordenlijst en geretourneerd. Als u tegelijk belt GetOrAdd op verschillende threads, kan het meerdere keren worden aangeroepen, valueFactory maar er wordt slechts één sleutel/waardepaar toegevoegd aan de woordenlijst.
De retourwaarde is afhankelijk van de aanwezigheid van de sleutel in de woordenlijst en of een sleutel/waarde wordt ingevoegd door een andere thread nadat GetOrAdd deze is aangeroepen, maar voordat valueFactory een waarde wordt gegenereerd:
| Scenario | Retourwaarde |
|---|---|
| De sleutel bevindt zich al in de woordenlijst. | De bestaande waarde wordt geretourneerd. |
De sleutel staat niet in de woordenlijst.
valueFactory genereert een waarde. Bij het opnieuw controleren van de sleutel is er geen sleutel gevonden. |
De sleutel/waarde wordt ingevoegd in de woordenlijst en de waarde wordt geretourneerd. |
De sleutel staat niet in de woordenlijst.
valueFactory genereert een waarde. Tijdens valueFactory het genereren van de waarde voegt een andere thread een waarde in voor de sleutel. Nadat valueFactory de sleutel is uitgevoerd en opnieuw is gecontroleerd, wordt de sleutel gevonden die door de andere thread is ingevoegd. |
De waarde die door de andere thread is ingevoegd, wordt geretourneerd. |