Re[2]: Неблокирующая коллекция локов с функцией самоочистки
От: LWhisper  
Дата: 15.08.16 17:32
Оценка:
Здравствуйте, okon, Вы писали:

O>А для каких целей нужен "объект блокировки для определенного ключа" ?

O>У вас по ключу лежит некий объект , почему бы не дать данным объектам необходимую реализацию, например можно сделать как базовый класc, который будет хранить SyncRoot, или интерфейс в котором будет свойство дающее SyncRoot.

Это архитектурная ошибка особенность кода, обусловленная наличием зависимости одного кэша объектов от другого. Как следствие, выделение ресурсов происходит в GetOrAdd. Приходится захватывать блокировку до, а не после.
Re: Неблокирующая коллекция локов с функцией самоочистки
От: seregaa Ниоткуда http://blogtani.ru
Дата: 15.08.16 18:21
Оценка:
Здравствуйте, LWhisper, Вы писали:

LW>Как следствие, выделение ресурсов происходит в GetOrAdd.


А если захват ресурсов выполнять уже после вызова GetOrAdd?

В функции-фабрике создавать легкие непроинициализированные объекты, а в переопределенной версии GetOrAdd запускать полную инициализацию перед тем, как вернуть объект наружу.

Lazy load в явном виде и с детерминированной инициализацией.
Мобильная версия сайта RSDN — http://rsdn.org/forum/rsdn/6938747
Автор: sergeya
Дата: 19.10.17
Re[5]: Неблокирующая коллекция локов с функцией самоочистки
От: Lexey Россия  
Дата: 16.08.16 09:53
Оценка: 4 (2)
Здравствуйте, LWhisper, Вы писали:

TK>>Так вызовите Dispose — в чем проблема?

TK>>Очевидно, что если GetOrAdd вернула не то, что было создано (или не создано) в переданной функции то, для предыдущего объекта надо вызвать Dispose()
LW>Гениально! А как?

Как-то так, видимо:
IDisposable localValue = null;
var globalValue = dict.GetOrAdd(key, _ =>
{
    localValue = valueFactory(_);
    return localValue;
});
if (globalValue != localValue)
{
    localValue?.Dispose();
}
"Будь достоин победы" (c) 8th Wizard's rule.
Отредактировано 16.08.2016 9:56 Lexey . Предыдущая версия . Еще …
Отредактировано 16.08.2016 9:55 Lexey . Предыдущая версия .
Re[6]: Неблокирующая коллекция локов с функцией самоочистки
От: LWhisper  
Дата: 17.08.16 08:47
Оценка:
Здравствуйте, Lexey, Вы писали:

L>Как-то так, видимо:

L>
L>IDisposable localValue = null;
L>var globalValue = dict.GetOrAdd(key, _ =>
L>{
L>    localValue = valueFactory(_);
L>    return localValue;
L>});
L>if (globalValue != localValue)
L>{
L>    localValue?.Dispose();
L>}
L>


Как частное решение — годится. Как общее — нет.
Не подходит для структур. Не подходит для ситуаций, когда вызов фабрики должен быть один или он достаточно требовательный ресурсам, чтобы дополнительные вызове были нежелательны.
Но в целом — да, имеет право на жизнь.
Re[7]: Неблокирующая коллекция локов с функцией самоочистки
От: TK Лес кывт.рф
Дата: 17.08.16 09:39
Оценка: +3 :))) :)
Здравствуйте, LWhisper, Вы писали:

LW>Как частное решение — годится. Как общее — нет.

LW>Не подходит для структур. Не подходит для ситуаций, когда вызов фабрики должен быть один или он достаточно требовательный ресурсам, чтобы дополнительные вызове были нежелательны.
LW>Но в целом — да, имеет право на жизнь.

Disposable структура? Да вы просто красавцы! Тут что либо ещё советовать — только портить
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[8]: Неблокирующая коллекция локов с функцией самоочистки
От: LWhisper  
Дата: 17.08.16 22:00
Оценка:
Здравствуйте, TK, Вы писали:

TK>Здравствуйте, LWhisper, Вы писали:


LW>>Как частное решение — годится. Как общее — нет.

LW>>Не подходит для структур. Не подходит для ситуаций, когда вызов фабрики должен быть один или он достаточно требовательный ресурсам, чтобы дополнительные вызове были нежелательны.
LW>>Но в целом — да, имеет право на жизнь.

TK>Disposable структура? Да вы просто красавцы! Тут что либо ещё советовать — только портить

Какая часть "общего" нуждается в пояснении?
Нет, "мы" пока ещё не красавцы. Но есть к чему стремиться, а я верю в людей.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.