last day (22 days later) » 

13:31
0
Q: Отследить выполнение асинхронного метода

FaradayВ какой-то момент начал ловить ошибку: fail: Microsoft.EntityFrameworkCore.Query[10100] An exception occurred while iterating over the results of a query for context type 'AppDbContext'. System.InvalidOperationException: A second operation was started on this context instance before a previous o...

зачем отслеживать второй поток, если проще - просто создать новый инстанс DbContext
@Grundy, на сколько я понимаю, ошибка связанна с тем, что где-то был пропущен await кем-то из коллег. Нужно отследить где именно он был пропущен, но я не понимаю как именно. DbContext создаётся через DI внутри сервиса где вызывается нужным метод. Но во время выполнения этого метода возникает выше указанная ошибка
я не понимаю как именно. DbContext создаётся через DI - ты должен где-то регистрировать зависимости
@Grundy, да, DbContext зарегистрирован в DI и до этого работал отлично без подобных ошибок. UPD: все зависимости зарегистрированы, включая контекст и вызывающий его сервис. Возможно я ошибся с тем, где именно искать причину? Я думаю, что ошибка возникает из-за параллельной попытки доступа к DbContext и отсутствии await в одном из мест во время выполнения запроса. Или я ошибаюсь?
Там где ты регистрируешь - ты указываешь как именно ты создаешь инстанс, на каждое обращение или один раз на все приложение и т.д.
Я думаю, что ошибка возникает из-за параллельной попытки доступа к DbContext и отсутствии await в одном из мест во время выполнения запроса - есть минимум два варианта, при регистрации зависимости некорректные настройки и dbcontext оДин на несколько запросов, либо есть несколько явных потоков которые работают с одним контекстом. наличие await - не играет большой роли, но зависит от конкретного кода.
13:31
Покажите конкретный кусок кода, где возникает исключение. От момента начала использования контекста.
@Grundy, я более чем уверен, что второй вариант является причиной ошибки. Почему не первый вариант? Потому что конфигу давно уже никто не трогал и она отрабатывала всегда отлично (по истории гита не вижу изменений). И я хотел бы каким-то образом отследить, откуда такое может произойти. Это как-то возможно сделать, или всё же прийдётся всё вручную пересматривать (очень комплексный запрос, может уйти много времени)
Потому что конфигу давно уже никто не трогал и она отрабатывала всегда отлично - просто не было подходящих условий. Добавь в вопрос как ты настраиваешь контекст DI и пример кода своего ShoppingCartApiController
@Grundy, кажется я нашёл причину ошибки, за что я вам очень благодарен (надеюсь код будет нормально отображаться: Guid user = currentUserContext.UserGuid; var cartResponse = shoppingCartService.AddToCart(user, cartItemVm); ServiceResponse wishlistResponse = await wishlistService.Add(user, model.MeasureId); return await cartResponse.ToActionResult(); Суть в том, что кто-то додумался получать не результат работы сервиса, а Task'у, параллельно вызвав второй сервис. Можете написать ответом с рекомендацией так же присматриваться к DI конфигу, я отмечу решением. Ещё раз спасибо
Проблема в том, что нет await у shoppingCartService.AddToCart? Вообще непонятно, как эти два сервиса завязаны с вашим, у них что, один и тот же контекс с вами?
@CrazyElf, да, прошу прощения, что не смог предоставить полную информацию в самом вопросе. Сама ошибка возникала внутри shoppingCartService во время обработки данных и других операций. На весь проект используется один контекст, который зарегистрирован как Scoped. При выполнении операции внутри shoppingCartService, вызывался другой сервис, который так же зависим от DbContext
13:31
Можешь попробовать как Transient регистрировать - возможно Даже без await заработает
@Grundy, если я не ошибаюсь, регистрировать DbContext нужно как Scoped, что бы не было параллельных обращений к контексту. Возможно ошибаюсь, но такой подход у меня всегда работал безотказно на моей практике. А саму ошибку, как уже уточнил, решил немного переписав последовательность вызовов
@Faraday не нужно, а можно. Посмотри чем отличается scoped от transient
13:53
@Grundy я знаю отличие между ними, просто никогда не использовал DbContext как transient
учитывая что рекомендуется много контекстов с маленькими запросами транзиент скорее всего даже больше подойдет

  last day (22 days later) »