Concurrentdictionary getoradd метод valueFactory выполнение [дубликат]C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Concurrentdictionary getoradd метод valueFactory выполнение [дубликат]

Сообщение Anonymous »

В документации concurrentdictionary указывается, что заводская фабрика называется вне замков, и что ключ/значение может быть вставлено другим потоком, в то время как ValueFactory генерирует значение, вы не можете вернуть это только потому, что выполняется ValueFactory, его созданное значение будет вставлено в словарь и возвращается.

Код: Выделить всё

public class MyClass
{
private readonly ConcurrentDictionary myData = new();

public Task GetData(string key)
{
return myData.GetOrAdd(key, key => longCalculation(key));
}
}
Если несколько потоков называют myclass.getData ("theSameKey") в одно и то же время LongCalculation будет работать несколько раз для "TheSameKey", потому что ValueFactory делегируется в другой строке. Предлагается JG в SD, чтобы делегат работал только один раз: < /p>

Код: Выделить всё

public class MyClass
{
private readonly ConcurrentDictionary myData = new();

public async Task GetData(string key)
{
var lazyTask = new new Lazy(() => longCalculation(key),
LazyThreadSafetyMode.ExecutionAndPublication);
var task = myData.GetOrAdd(key, lazyTask).Value;
return await task;
}
}
В этой версии, если несколько потоков называют myclass.getdata ("theSamekey") longcalculation выполняется только один раз. Хотя у меня есть исправление, чтобы получить поведение, которое я хочу, я хотел бы получить больше подробностей, объясняющих, почему я получаю это поведение.

Подробнее здесь: https://stackoverflow.com/questions/795 ... -execution
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Concurrentdictionary getoradd метод valueFactory выполнение [дубликат]
    Anonymous » » в форуме C#
    0 Ответы
    2 Просмотры
    Последнее сообщение Anonymous
  • Гарантируется ли ConcurrentDictionary.GetOrAdd() вызов valueFactoryMethod только один раз для каждого ключа?
    Anonymous » » в форуме C#
    0 Ответы
    26 Просмотры
    Последнее сообщение Anonymous
  • Как я могу сказать ConcurrentDictionary.GetOrAdd не добавлять значение?
    Anonymous » » в форуме C#
    0 Ответы
    13 Просмотры
    Последнее сообщение Anonymous
  • Известные побочные эффекты при использовании оператора блокировки в ConcurrentDictionary.GetOrAdd?
    Гость » » в форуме C#
    0 Ответы
    11 Просмотры
    Последнее сообщение Гость
  • Как я могу сказать ConcurrentDictionary.GetOrAdd не добавлять значение?
    Гость » » в форуме C#
    0 Ответы
    9 Просмотры
    Последнее сообщение Гость

Вернуться в «C#»