• Как изолировать выполнение кода несколькими потоками?

    @kttotto
    пофиг на чем писать
    Первое, если OrderService не будет резолвится как синглтон, то на каждый запрос будет создваться свой инстанс сервиса, т.е двух потоков на один метод не будет.

    Второе, если он резолвится как синглтон, то у Вас проблемы, т.к. внутри dbContext будет один для всех запросов, а его лучше создавать по новой для каждого запроса.

    Третье, чтобы не было двух одновременных запросов с одного клиента, надо дизейблить кнопку и показывать прелоадер до получения ответа.

    Ну и четвертое, если хотите получить баланс до того как другой запрос туда что-то добавит, то в AddOrder используйте транзакции с достаточным уровнем блокировки на изменение.
    Ответ написан
    3 комментария
  • Как изолировать выполнение кода несколькими потоками?

    hePPer
    @hePPer
    если используете ОРМ EF - то пробуйте использовать атрибут ConcurrencyCheck для проверки на уровне базы.
    ссылка
    Ответ написан
    2 комментария
  • Как изолировать выполнение кода несколькими потоками?

    Это вообще нормальная практика? Есть какие-то ещё варианты?

    Блокировать потоки-обработчики запросов -- плохая, вредная практика. Потоки -- ресурсы не бесконечные, как сами по себе, так и вычислительные ресурсы, требуемые потоками. У вас просто появляется шанс, что всем запросам не хватит ОЗУ.
    1 поток, обрабатывающий заказы по очереди. Это может быть 1 поток на пользователя, может даже не быть потоков как таковых: флаг, запрещающий создавать\обрабатывать заказы, при наличии неотработанного заказа у пользователя. Но чаще всего, это отдельный (микро)сервис, который собственно получает от веб-сервера заказы, складывает в очередь и уже с этой очередью работает.
    Основная задача -- организовать очередь.
    Ответ написан
    1 комментарий