ConcurrentDictionary<TKey,TValue>.AddOrUpdate Yöntem
Tanım
Önemli
Bazı bilgiler ürünün ön sürümüyle ilgilidir ve sürüm öncesinde önemli değişiklikler yapılmış olabilir. Burada verilen bilgilerle ilgili olarak Microsoft açık veya zımni hiçbir garanti vermez.
Anahtarın mevcut olmaması durumunda öğesine bir anahtar/değer çifti ConcurrentDictionary<TKey,TValue> ekler veya anahtarın zaten mevcut olması durumunda içindeki bir anahtar/değer çiftini ConcurrentDictionary<TKey,TValue> güncelleştirir.
Aşırı Yüklemeler
AddOrUpdate(TKey, Func<TKey,TValue>, Func<TKey,TValue,TValue>) |
Belirtilen işlevleri kullanarak anahtar yoksa öğesine bir anahtar/değer çifti ConcurrentDictionary<TKey,TValue> ekler veya anahtarın zaten varsa içindeki bir anahtar/değer çiftini ConcurrentDictionary<TKey,TValue> güncelleştirir. |
AddOrUpdate(TKey, TValue, Func<TKey,TValue,TValue>) |
Anahtarın mevcut olmaması durumunda öğesine bir anahtar/değer çifti ConcurrentDictionary<TKey,TValue> ekler veya anahtar zaten varsa belirtilen işlevi kullanarak içindeki bir anahtar/değer çiftini ConcurrentDictionary<TKey,TValue> güncelleştirir. |
AddOrUpdate<TArg>(TKey, Func<TKey,TArg,TValue>, Func<TKey,TValue,TArg,TValue>, TArg) |
Belirtilen işlevleri ve bağımsız değişkeni kullanarak anahtar yoksa öğesine bir anahtar/değer çifti ConcurrentDictionary<TKey,TValue> ekler veya anahtarın zaten varsa içindeki bir anahtar/değer çiftini ConcurrentDictionary<TKey,TValue> güncelleştirir. |
Örnekler
Aşağıdaki örnekte yönteminin nasıl çağrılacakları gösterilmektedir AddOrUpdate :
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
AddOrUpdate(TKey, Func<TKey,TValue>, Func<TKey,TValue,TValue>)
- Kaynak:
- ConcurrentDictionary.cs
- Kaynak:
- ConcurrentDictionary.cs
- Kaynak:
- ConcurrentDictionary.cs
Belirtilen işlevleri kullanarak anahtar yoksa öğesine bir anahtar/değer çifti ConcurrentDictionary<TKey,TValue> ekler veya anahtarın zaten varsa içindeki bir anahtar/değer çiftini ConcurrentDictionary<TKey,TValue> güncelleştirir.
public:
TValue AddOrUpdate(TKey key, Func<TKey, TValue> ^ addValueFactory, Func<TKey, TValue, TValue> ^ updateValueFactory);
public TValue AddOrUpdate (TKey key, Func<TKey,TValue> addValueFactory, Func<TKey,TValue,TValue> updateValueFactory);
member this.AddOrUpdate : 'Key * Func<'Key, 'Value> * Func<'Key, 'Value, 'Value> -> 'Value
Public Function AddOrUpdate (key As TKey, addValueFactory As Func(Of TKey, TValue), updateValueFactory As Func(Of TKey, TValue, TValue)) As TValue
Parametreler
- key
- TKey
Eklenecek veya değeri güncelleştirilmesi gereken anahtar.
- addValueFactory
- Func<TKey,TValue>
Eksik bir anahtar için değer oluşturmak için kullanılan işlev.
- updateValueFactory
- Func<TKey,TValue,TValue>
Anahtarın mevcut değerine göre mevcut anahtar için yeni bir değer oluşturmak için kullanılan işlev.
Döndürülenler
Anahtarın yeni değeri. addValueFactory
Bu, (anahtar yoksa) veya sonucu updateValueFactory
(anahtar varsa) olur.
Özel durumlar
key
, addValueFactory
veya updateValueFactory
şeklindedir null
.
Sözlük çok fazla öğe içeriyor.
Açıklamalar
Farklı iş parçacıklarında aynı anda çağırırsanız AddOrUpdate , addValueFactory
birden çok kez çağrılabilir, ancak anahtar/değer çifti her çağrı için sözlüğe eklenmeyebilir.
Sözlükte yapılan değişiklikler ve yazma işlemleri için, ConcurrentDictionary<TKey,TValue> iş parçacığı güvenliğini sağlamak için ayrıntılı kilitleme kullanır (sözlükteki okuma işlemleri kilitsiz bir şekilde gerçekleştirilir). değerin addValueFactory
beklendiği gibi eklendiğini veya güncelleştirildiğinden emin olmak için ve updateValueFactory
temsilcileri birden çok kez yürütülebilir. Ancak, bilinmeyen kodun bir kilit altında yürütülmesinden kaynaklanabilecek sorunları önlemek için bunlar kilitlerin dışında çağrılır. Bu nedenle, AddOrUpdate sınıfındaki ConcurrentDictionary<TKey,TValue> diğer tüm işlemler açısından atomik değildir.
Ayrıca bkz.
- İş Parçacığı Güvenli Koleksiyonlar
- Nasıl yapılır: Öğeleri Ekleme ve Bir ConcurrentDictionary'den Alma
Şunlara uygulanır
AddOrUpdate(TKey, TValue, Func<TKey,TValue,TValue>)
- Kaynak:
- ConcurrentDictionary.cs
- Kaynak:
- ConcurrentDictionary.cs
- Kaynak:
- ConcurrentDictionary.cs
Anahtarın mevcut olmaması durumunda öğesine bir anahtar/değer çifti ConcurrentDictionary<TKey,TValue> ekler veya anahtar zaten varsa belirtilen işlevi kullanarak içindeki bir anahtar/değer çiftini ConcurrentDictionary<TKey,TValue> güncelleştirir.
public:
TValue AddOrUpdate(TKey key, TValue addValue, Func<TKey, TValue, TValue> ^ updateValueFactory);
public TValue AddOrUpdate (TKey key, TValue addValue, Func<TKey,TValue,TValue> updateValueFactory);
member this.AddOrUpdate : 'Key * 'Value * Func<'Key, 'Value, 'Value> -> 'Value
Public Function AddOrUpdate (key As TKey, addValue As TValue, updateValueFactory As Func(Of TKey, TValue, TValue)) As TValue
Parametreler
- key
- TKey
Eklenecek veya değeri güncelleştirilmesi gereken anahtar.
- addValue
- TValue
Eksik anahtar için eklenecek değer.
- updateValueFactory
- Func<TKey,TValue,TValue>
Anahtarın mevcut değerine göre mevcut anahtar için yeni bir değer oluşturmak için kullanılan işlev.
Döndürülenler
Anahtarın yeni değeri. Bu, (anahtar yoksa) veya sonucu updateValueFactory
(anahtar varsa) olur addValue
.
Özel durumlar
key
veya updateValueFactory
şeklindedir null
.
Sözlük çok fazla öğe içeriyor.
Örnekler
Aşağıdaki kod örneği, ConcurrentDictionary<TKey,TValue> koleksiyonuna ek bir öğe eklemek ve mevcut öğeleri güncelleştirmek için bir başlatmayı ve AddOrUpdate yöntemini kullanmayı gösterir.
using System;
using System.Collections.Concurrent;
class CD_Ctor
{
// Demonstrates:
// ConcurrentDictionary<TKey, TValue> ctor(concurrencyLevel, initialCapacity)
// ConcurrentDictionary<TKey, TValue>[TKey]
static void Main()
{
// We know how many items we want to insert into the ConcurrentDictionary.
// So set the initial capacity to some prime number above that, to ensure that
// the ConcurrentDictionary does not need to be resized while initializing it.
int HIGHNUMBER = 64;
int initialCapacity = 101;
// The higher the concurrencyLevel, the higher the theoretical number of operations
// that could be performed concurrently on the ConcurrentDictionary. However, global
// operations like resizing the dictionary take longer as the concurrencyLevel rises.
// For the purposes of this example, we'll compromise at numCores * 2.
int numProcs = Environment.ProcessorCount;
int concurrencyLevel = numProcs * 2;
// Construct the dictionary with the desired concurrencyLevel and initialCapacity
ConcurrentDictionary<int, int> cd = new ConcurrentDictionary<int, int>(concurrencyLevel, initialCapacity);
// Initialize the dictionary
for (int i = 1; i <= HIGHNUMBER; i++) cd[i] = i * i;
Console.WriteLine("The square of 23 is {0} (should be {1})", cd[23], 23 * 23);
// Now iterate through, adding one to the end of the list. Existing items should be updated to be divided by their
// key and a new item will be added that is the square of its key.
for (int i = 1; i <= HIGHNUMBER + 1; i++)
cd.AddOrUpdate(i, i * i, (k,v) => v / i);
Console.WriteLine("The square root of 529 is {0} (should be {1})", cd[23], 529 / 23);
Console.WriteLine("The square of 65 is {0} (should be {1})", cd[HIGHNUMBER + 1], ((HIGHNUMBER + 1) * (HIGHNUMBER + 1)));
}
}
open System
open System.Collections.Concurrent
// Demonstrates:
// ConcurrentDictionary<TKey, TValue> ctor(concurrencyLevel, initialCapacity)
// ConcurrentDictionary<TKey, TValue>[TKey]
// We know how many items we want to insert into the ConcurrentDictionary.
// So set the initial capacity to some prime number above that, to ensure that
// the ConcurrentDictionary does not need to be resized while initializing it.
let HIGHNUMBER = 64
let initialCapacity = 101
// The higher the concurrencyLevel, the higher the theoretical number of operations
// that could be performed concurrently on the ConcurrentDictionary. However, global
// operations like resizing the dictionary take longer as the concurrencyLevel rises.
// For the purposes of this example, we'll compromise at numCores * 2.
let numProcs = Environment.ProcessorCount
let concurrencyLevel = numProcs * 2
// Construct the dictionary with the desired concurrencyLevel and initialCapacity
let cd = ConcurrentDictionary<int, int>(concurrencyLevel, initialCapacity)
// Initialize the dictionary
for i = 1 to HIGHNUMBER do
cd[i] <- i * i
printfn $"The square of 23 is {cd[23]} (should be {23 * 23})"
// Now iterate through, adding one to the end of the list. Existing items should be updated to be divided by their
// key and a new item will be added that is the square of its key.
for i = 1 to HIGHNUMBER + 1 do
cd.AddOrUpdate(i, i * i, (fun k v -> v / i)) |> ignore
printfn $"The square root of 529 is {cd[23]} (should be {529 / 23})"
printfn $"The square of 65 is {cd[HIGHNUMBER + 1]} (should be {(HIGHNUMBER + 1) * (HIGHNUMBER + 1)})"
Imports System.Collections.Concurrent
Class CD_Ctor
' Demonstrates:
' ConcurrentDictionary<TKey, TValue> ctor(concurrencyLevel, initialCapacity)
' ConcurrentDictionary<TKey, TValue>[TKey]
Public Shared Sub Main()
' We know how many items we want to insert into the ConcurrentDictionary.
' So set the initial capacity to some prime number above that, to ensure that
' the ConcurrentDictionary does not need to be resized while initializing it.
Dim HIGHNUMBER As Integer = 64
Dim initialCapacity As Integer = 101
' The higher the concurrencyLevel, the higher the theoretical number of operations
' that could be performed concurrently on the ConcurrentDictionary. However, global
' operations like resizing the dictionary take longer as the concurrencyLevel rises.
' For the purposes of this example, we'll compromise at numCores * 2.
Dim numProcs As Integer = Environment.ProcessorCount
Dim concurrencyLevel As Integer = numProcs * 2
' Construct the dictionary with the desired concurrencyLevel and initialCapacity
Dim cd As New ConcurrentDictionary(Of Integer, Integer)(concurrencyLevel, initialCapacity)
' Initialize the dictionary
For i As Integer = 1 To HIGHNUMBER
cd(i) = i * i
Next
Console.WriteLine("The square of 23 is {0} (should be {1})", cd(23), 23 * 23)
' Now iterate through, adding one to the end of the list. Existing items should be updated to be divided by their
' key and a new item will be added that is the square of its key.
For i As Integer = 1 To HIGHNUMBER + 1
cd.AddOrUpdate(i, i * i, Function(k, v)
Return v / i
End Function)
Next
Console.WriteLine("The square root of 529 is {0} (should be {1})", cd(23), 529 / 23)
Console.WriteLine("The square of 65 is {0} (should be {1})", cd(HIGHNUMBER + 1), ((HIGHNUMBER + 1) * (HIGHNUMBER + 1)))
End Sub
End Class
Sözlükte yapılan değişiklikler ve yazma işlemleri için, ConcurrentDictionary<TKey,TValue> iş parçacığı güvenliğini sağlamak için ayrıntılı kilitleme kullanır. (Sözlükteki okuma işlemleri kilitsiz bir şekilde gerçekleştirilir.) değerin addValueFactory
beklendiği gibi eklendiğini veya güncelleştirildiğinden emin olmak için ve updateValueFactory
temsilcileri birden çok kez yürütülebilir. Ancak, bilinmeyen kodun bir kilit altında yürütülmesinden kaynaklanabilecek sorunları önlemek için bunlar kilitlerin dışında çağrılır. Bu nedenle, AddOrUpdate sınıfındaki ConcurrentDictionary<TKey,TValue> diğer tüm işlemler açısından atomik değildir.
Ayrıca bkz.
- İş Parçacığı Güvenli Koleksiyonlar
- Nasıl yapılır: Öğeleri Ekleme ve Bir ConcurrentDictionary'den Alma
Şunlara uygulanır
AddOrUpdate<TArg>(TKey, Func<TKey,TArg,TValue>, Func<TKey,TValue,TArg,TValue>, TArg)
- Kaynak:
- ConcurrentDictionary.cs
- Kaynak:
- ConcurrentDictionary.cs
- Kaynak:
- ConcurrentDictionary.cs
Belirtilen işlevleri ve bağımsız değişkeni kullanarak anahtar yoksa öğesine bir anahtar/değer çifti ConcurrentDictionary<TKey,TValue> ekler veya anahtarın zaten varsa içindeki bir anahtar/değer çiftini ConcurrentDictionary<TKey,TValue> güncelleştirir.
public:
generic <typename TArg>
TValue AddOrUpdate(TKey key, Func<TKey, TArg, TValue> ^ addValueFactory, Func<TKey, TValue, TArg, TValue> ^ updateValueFactory, TArg factoryArgument);
public TValue AddOrUpdate<TArg> (TKey key, Func<TKey,TArg,TValue> addValueFactory, Func<TKey,TValue,TArg,TValue> updateValueFactory, TArg factoryArgument);
member this.AddOrUpdate : 'Key * Func<'Key, 'Arg, 'Value> * Func<'Key, 'Value, 'Arg, 'Value> * 'Arg -> 'Value
Public Function AddOrUpdate(Of TArg) (key As TKey, addValueFactory As Func(Of TKey, TArg, TValue), updateValueFactory As Func(Of TKey, TValue, TArg, TValue), factoryArgument As TArg) As TValue
Tür Parametreleri
- TArg
ve updateValueFactory
içine geçirecek addValueFactory
bağımsız değişkenin türü.
Parametreler
- key
- TKey
Eklenecek veya değeri güncelleştirilmesi gereken anahtar.
- addValueFactory
- Func<TKey,TArg,TValue>
Eksik bir anahtar için değer oluşturmak için kullanılan işlev.
- updateValueFactory
- Func<TKey,TValue,TArg,TValue>
Anahtarın mevcut değerine göre mevcut anahtar için yeni bir değer oluşturmak için kullanılan işlev.
- factoryArgument
- TArg
ve updateValueFactory
içine addValueFactory
geçirmek için bir bağımsız değişken.
Döndürülenler
Anahtarın yeni değeri. addValueFactory
Bu, (anahtar yoksa) veya sonucu updateValueFactory
(anahtar varsa) olur.
Özel durumlar
key
, addValueFactory
veya updateValueFactory
null başvurudur (Visual Basic'te Hiçbir şey).
Sözlük çok fazla öğe içeriyor.
Açıklamalar
Farklı iş parçacıklarında aynı anda çağırırsanız AddOrUpdate , addValueFactory
birden çok kez çağrılabilir, ancak anahtar/değer çifti her çağrı için sözlüğe eklenmeyebilir.
Sözlükte yapılan değişiklikler ve yazma işlemleri için, ConcurrentDictionary<TKey,TValue> iş parçacığı güvenliğini sağlamak için ayrıntılı kilitleme kullanır. (Sözlükteki okuma işlemleri kilitsiz bir şekilde gerçekleştirilir.) değerin addValueFactory
beklendiği gibi eklendiğini veya güncelleştirildiğinden emin olmak için ve updateValueFactory
temsilcileri birden çok kez yürütülebilir. Ancak, bilinmeyen kodun bir kilit altında yürütülmesinden kaynaklanabilecek sorunları önlemek için bunlar kilitlerin dışında çağrılır. Bu nedenle, AddOrUpdate sınıfındaki ConcurrentDictionary<TKey,TValue> diğer tüm işlemler açısından atomik değildir.