170 похожих чатов

Подскажите, а как MessagingClientGet сделать атомарным без .GetAwaiter().GetResult() ?

14 ответов

6 просмотров

await написать???

Anton- Автор вопроса
Ayrat Hudaygulov
await написать???

я это с ConcurrentDictionary не могу сделать нормально

Anton
я это с ConcurrentDictionary не могу сделать норма...

да можешь, просто у тебя фабрика асинхронная

Anton- Автор вопроса
Ayrat Hudaygulov
да можешь, просто у тебя фабрика асинхронная

valueFactory: async _ => await _messagingClientFactory.Create(name) так не могу или ты о другом?

Anton
valueFactory: async _ => await _messagingClientFac...

а, я понял. у тебя внутри дикшнари фабрики надо асинк метод вызвать

Атомарная в плане не должно быть вызова, пока не не закончится предыдущий?

Anton
valueFactory: async _ => await _messagingClientFac...

valueFactory не атомарно вызывается

Evgeniy Alexandrov
это зовется "оптимистично"

ну в общем там гарантий что вызвано будет один раз - нет

Ayrat Hudaygulov
ну в общем там гарантий что вызвано будет один раз...

угу, поэтому сейчас нужно будет либо внимательно посмотреть на требования с вопросом "а не хуйню ли я творю" либо начать городить ConcurrentDictionary<string, Lazy<Task<IMessageClient>>>

Anton- Автор вопроса

да можно просто: GetAwaiter().GetResult() :) раз valueFactory не атомарно вызывается

Anton
да можно просто: GetAwaiter().GetResult() :) раз v...

Ахем... а что ты подразумеваешь под атомарным? Если IMessageClient у тебя IDisposable - то оно при конфликте и потечь может

Evgeniy Alexandrov
Ахем... а что ты подразумеваешь под атомарным? Есл...

иногда под этим ошибочно подразумевают экзлюзивность выполнения кода фабрики

Anton- Автор вопроса
Evgeniy Alexandrov
угу, поэтому сейчас нужно будет либо внимательно п...

кстати, я вот подумал.. по идее в данном случае GetAwaiter().GetResult() лучше чем условно это: public Task<IMessagingClient> MessagingClientGet(string name) { var lazy = _messagingClients.GetOrAdd( name, _ => new Lazy<Task<IMessagingClient>>(() => _messagingClientFactory.Create(name))); return lazy.Value; } в случае если метод будет вызываться постоянно мы либо блочим один раз, либо берем из кеша каждый раз

Похожие вопросы

Обсуждают сегодня

подскажите пожалуйста, как мне освободить результат записанный в переменную result? в чем проблема подскажите если МОЖЕТЕ?
Михаил Helper
28
есть тут кто-то , кто только начал изучать си? если проходите курс на степике или как-то сами изучаете, пишите, может, скооперируемся?..
Eule
25
Скажите, тут нет проблемы? IMyInterface1 = interface function GetInterface2: IInterface2; ... function TMyInterface.GetInterface2: IInterface2; begin Result := TI...
Ruslan aka DUDE
18
Добрый день. Абракадабра в 12-й студии ввела новый тип поля БД TSQLTimeStampOffset, использую в постгресе timestampz и вот с 12-й версии начались чудеса! До этого поля times...
Delphi Photo
9
Коллеги, здравствуйте! А можно узнать ваше мнение относительно Wolfram Mathematica vs Julia? Просто у меня стоит выбор между тем, чтобы продолжить преподавать Wolfram Mathemat...
Илья Гаража
10
Обновленный chat тестили уже господа? Готовимся на заводы ? Простой проект на ларавель собирает за 1 ответ..
Jacov Borisov
14
А если без шуток, на чем десктоп сейчас пишут кроссплатформенный (ну чтобы с минимальным допиливанием под каждую платформу) и чтобы хорошая производительность софта была. Толь...
🐈
9
коллеги привет. уже второй день бьемся об заклад с одной ошибкой, может вы сталкивались с таки странным поведением? есть тестовый сервер, на который паблишим релизную версию W...
Magzhan
11
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
кому не сложно распишите пожалуйста для какой цели тут вот эти скобки и в них пихается указатель?
Михаил Helper
15
Карта сайта