ConcurrentDictionary<TKey,TValue>.GetOrAdd Methode

Definitie

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

TValue

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

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

TValue

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

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

TValue

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.

Van toepassing op