ConcurrentDictionary<TKey,TValue>.GetOrAdd Metod
Definition
Viktigt
En del information gäller för förhandsversionen av en produkt och kan komma att ändras avsevärt innan produkten blir allmänt tillgänglig. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, avseende informationen som visas här.
Lägger till ett nyckel/värde-par till ConcurrentDictionary<TKey,TValue> om nyckeln inte redan finns. Returnerar det nya värdet eller det befintliga värdet om nyckeln redan finns.
Överlagringar
| Name | Description |
|---|---|
| GetOrAdd(TKey, Func<TKey,TValue>) |
Lägger till ett nyckel/värde-par i ConcurrentDictionary<TKey,TValue> med hjälp av den angivna funktionen om nyckeln inte redan finns. Returnerar det nya värdet eller det befintliga värdet om nyckeln finns. |
| GetOrAdd(TKey, TValue) |
Lägger till ett nyckel/värde-par till ConcurrentDictionary<TKey,TValue> om nyckeln inte redan finns. Returnerar det nya värdet eller det befintliga värdet om nyckeln finns. |
| GetOrAdd<TArg>(TKey, Func<TKey,TArg,TValue>, TArg) |
Lägger till ett nyckel/värde-par i ConcurrentDictionary<TKey,TValue> med hjälp av den angivna funktionen och ett argument om nyckeln inte redan finns, eller returnerar det befintliga värdet om nyckeln finns. |
Exempel
I följande exempel visas hur du anropar GetOrAdd metoden:
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>)
Lägger till ett nyckel/värde-par i ConcurrentDictionary<TKey,TValue> med hjälp av den angivna funktionen om nyckeln inte redan finns. Returnerar det nya värdet eller det befintliga värdet om nyckeln finns.
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
Parametrar
- key
- TKey
Nyckeln för elementet som ska läggas till.
- valueFactory
- Func<TKey,TValue>
Funktionen som används för att generera ett värde för nyckeln.
Returer
Värdet för nyckeln. Det här är antingen det befintliga värdet för nyckeln om nyckeln redan finns i ordlistan eller det nya värdet om nyckeln inte fanns i ordlistan.
Undantag
key eller valueFactory är null.
Ordlistan innehåller för många element.
Kommentarer
För ändringar och skrivåtgärder i ordlistan ConcurrentDictionary<TKey,TValue> använder finkornig låsning för att säkerställa trådsäkerheten. (Läsåtgärder i ordlistan utförs på ett låsfritt sätt.) Ombudet valueFactory anropas dock utanför låsen för att undvika de problem som kan uppstå vid körning av okänd kod under ett lås.
GetOrAdd Är därför inte atomisk när det gäller alla andra åtgärder i ConcurrentDictionary<TKey,TValue> klassen.
Eftersom en nyckel/ett värde kan infogas av en annan tråd medan valueFactory ett värde genereras kan du inte lita på att bara för valueFactory att det körs infogas dess genererade värde i ordlistan och returneras. Om du anropar GetOrAdd samtidigt i olika trådar valueFactory kan det anropas flera gånger, men endast ett nyckel/värde-par läggs till i ordlistan.
Returvärdet beror på förekomsten av nyckeln i ordlistan och om en nyckel/ett värde infogas av en annan tråd efter GetOrAdd anropas men innan valueFactory genererar ett värde:
| Scenario | Returvärde |
|---|---|
| Nyckeln finns redan i ordlistan. | Det befintliga värdet returneras. |
Nyckeln finns inte i ordlistan.
valueFactory genererar ett värde. Vid återkontroll för nyckeln hittas ingen nyckel. |
Nyckeln/värdet infogas i ordlistan och värdet returneras. |
Nyckeln finns inte i ordlistan.
valueFactory genererar ett värde. Medan valueFactory genererar värdet infogar en annan tråd ett värde för nyckeln. När valueFactory du har kört och när du har kontrollerat nyckeln igen hittas nyckeln som infogats av den andra tråden. |
Värdet som infogas av den andra tråden returneras. |
Se även
Gäller för
GetOrAdd(TKey, TValue)
Lägger till ett nyckel/värde-par till ConcurrentDictionary<TKey,TValue> om nyckeln inte redan finns. Returnerar det nya värdet eller det befintliga värdet om nyckeln finns.
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
Parametrar
- key
- TKey
Nyckeln för elementet som ska läggas till.
- value
- TValue
Värdet som ska läggas till, om nyckeln inte redan finns.
Returer
Värdet för nyckeln. Det här är antingen det befintliga värdet för nyckeln om nyckeln redan finns i ordlistan eller det nya värdet om nyckeln inte fanns i ordlistan.
Undantag
key är null.
Ordlistan innehåller för många element.
Se även
Gäller för
GetOrAdd<TArg>(TKey, Func<TKey,TArg,TValue>, TArg)
Lägger till ett nyckel/värde-par i ConcurrentDictionary<TKey,TValue> med hjälp av den angivna funktionen och ett argument om nyckeln inte redan finns, eller returnerar det befintliga värdet om nyckeln finns.
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
Typparametrar
- TArg
Typen av argument som ska skickas till valueFactory.
Parametrar
- key
- TKey
Nyckeln för elementet som ska läggas till.
- valueFactory
- Func<TKey,TArg,TValue>
Funktionen som används för att generera ett värde för nyckeln.
- factoryArgument
- TArg
Ett argumentvärde som ska skickas till valueFactory.
Returer
Värdet för nyckeln. Det här är antingen det befintliga värdet för nyckeln om nyckeln redan finns i ordlistan eller det nya värdet om nyckeln inte fanns i ordlistan.
Undantag
key är en referens för null (ingenting i Visual Basic).
Ordlistan innehåller för många element.
Kommentarer
För ändringar och skrivåtgärder i ordlistan ConcurrentDictionary<TKey,TValue> använder finkornig låsning för att säkerställa trådsäkerheten. (Läsåtgärder i ordlistan utförs på ett låsfritt sätt.) Ombudet valueFactory anropas dock utanför låsen för att undvika de problem som kan uppstå vid körning av okänd kod under ett lås.
GetOrAdd Är därför inte atomisk när det gäller alla andra åtgärder i ConcurrentDictionary<TKey,TValue> klassen.
Eftersom en nyckel/ett värde kan infogas av en annan tråd medan valueFactory ett värde genereras kan du inte lita på att bara för valueFactory att det körs infogas dess genererade värde i ordlistan och returneras. Om du anropar GetOrAdd samtidigt i olika trådar valueFactory kan det anropas flera gånger, men endast ett nyckel/värde-par läggs till i ordlistan.
Returvärdet beror på förekomsten av nyckeln i ordlistan och om en nyckel/ett värde infogas av en annan tråd efter GetOrAdd anropas men innan valueFactory genererar ett värde:
| Scenario | Returvärde |
|---|---|
| Nyckeln finns redan i ordlistan. | Det befintliga värdet returneras. |
Nyckeln finns inte i ordlistan.
valueFactory genererar ett värde. Vid återkontroll för nyckeln hittas ingen nyckel. |
Nyckeln/värdet infogas i ordlistan och värdet returneras. |
Nyckeln finns inte i ordlistan.
valueFactory genererar ett värde. Medan valueFactory genererar värdet infogar en annan tråd ett värde för nyckeln. När valueFactory du har kört och när du har kontrollerat nyckeln igen hittas nyckeln som infogats av den andra tråden. |
Värdet som infogas av den andra tråden returneras. |