Size: a a a

var chat = new Chat();

2021 July 13

VL

Vova Lantsov in var chat = new Chat();
Блокировать чтобы бэкграунд сервис мог ждать появления в очереди элемента, а не пинговать в каком-то while (true)

Итого будет выглядеть как
await foreach (var item in mostRecentBlockingCollection.GetConsumingEnumerable())
{
   ...
}

Вместо того чтобы свой велосипед изобретать)
источник

VL

Vova Lantsov in var chat = new Chat();
Ну и каналы в принципе это lightweight механизм
источник

E

Etki in var chat = new Chat();
ринг баффер это классика
источник

E

Etki in var chat = new Chat();
и более лайтвейт вы ничего не найдете
источник

VL

Vova Lantsov in var chat = new Chat();
Я думаю какой-то ринг баффер там и работает
источник

VL

Vova Lantsov in var chat = new Chat();
Под капотом
источник

YM

Yury Morozov in var chat = new Chat();
А как же БД раньше работали?
источник

YM

Yury Morozov in var chat = new Chat();
Там где ты написал есть концептуальная проблема. Минусоваться баланс должен в БД, тогда все проблемы решаться сразу в БД
источник

YM

Yury Morozov in var chat = new Chat();
И если все делает БД то нет никаких проблем ей самой проверить что баланc > 0
источник

YM

Yury Morozov in var chat = new Chat();
Так что дергай хранимку из EF
источник

YM

Yury Morozov in var chat = new Chat();
И будет счастье
источник

VL

Vova Lantsov in var chat = new Chat();
Хранимая процедура
источник

YM

Yury Morozov in var chat = new Chat();
На списание баланса
источник

YM

Yury Morozov in var chat = new Chat();
Нет
источник

YM

Yury Morozov in var chat = new Chat();
EF сначала считает значение, потом ты минуснешь и проапдейтишь значением. Если в это время кто-то минуснул, то ты перезапишешь по факту
источник

YM

Yury Morozov in var chat = new Chat();
Если ты дергаешь хранимку, то ты не апдейтишь, а минусуешь на уровне БД. БД сама знает, есть транзакция сейчас и сама разрулит. Если баланс изменился - то будет не 9, а 8
источник

YM

Yury Morozov in var chat = new Chat();
Если в процессе баланс станет отрицательным - хранимка вернет в бэк ошибку
источник

YM

Yury Morozov in var chat = new Chat();
Т.е EF использует сырые данные, но все операции с деньгами в БД, а по результатам апдейтишь свой EF объект
источник

YM

Yury Morozov in var chat = new Chat();
Да, есть иной вариант
источник

YM

Yury Morozov in var chat = new Chat();
источник