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 МБ.

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