await написать???
я это с ConcurrentDictionary не могу сделать нормально
да можешь, просто у тебя фабрика асинхронная
valueFactory: async _ => await _messagingClientFactory.Create(name) так не могу или ты о другом?
а, я понял. у тебя внутри дикшнари фабрики надо асинк метод вызвать
Атомарная в плане не должно быть вызова, пока не не закончится предыдущий?
valueFactory не атомарно вызывается
это зовется "оптимистично"
ну в общем там гарантий что вызвано будет один раз - нет
угу, поэтому сейчас нужно будет либо внимательно посмотреть на требования с вопросом "а не хуйню ли я творю" либо начать городить ConcurrentDictionary<string, Lazy<Task<IMessageClient>>>
да можно просто: GetAwaiter().GetResult() :) раз valueFactory не атомарно вызывается
Ахем... а что ты подразумеваешь под атомарным? Если IMessageClient у тебя IDisposable - то оно при конфликте и потечь может
иногда под этим ошибочно подразумевают экзлюзивность выполнения кода фабрики
кстати, я вот подумал.. по идее в данном случае GetAwaiter().GetResult() лучше чем условно это: public Task<IMessagingClient> MessagingClientGet(string name) { var lazy = _messagingClients.GetOrAdd( name, _ => new Lazy<Task<IMessagingClient>>(() => _messagingClientFactory.Create(name))); return lazy.Value; } в случае если метод будет вызываться постоянно мы либо блочим один раз, либо берем из кеша каждый раз
Обсуждают сегодня