В документации 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