Александр Никульшин, разницы большой нет. autofac даёт чуть более простую регистрацию благодаря встроенному дискаверингу + из коробки есть autofac modules.
В то же время MS DI гораздо более легковесный и дискаверинг с модулями можно подключить отдельно.
Александр Никульшин,
2. Создавай HttpClient один раз в каком-нибудь одном месте и переиспользуй. Или используй IHttpClientFactory
4. А где dbContext диспозится?
И что там на счёт Task.Run?
Вполне возможно, что у тебя одновременно отрабатывает и сохранение и выгрузка.
Александр Никульшин,
1. Нельзя к одному DbContext обращаться из нескольких потоков. Тем более, раз у тебя sqlite, то в принципе нельзя одновременно к одной базе из разных потоков обращаться.
2.
await new HttpClient()
Нельзя так писать. У тебя так просто сокеты все утекут и ты не сможешь больше запросы делать.
3.
await забыл. Нельзя .Result делать
4. Где создаётся экземпляр db и _db?
У меня больше всего подозрения на Task.Run, так как нельзя проверить, как в реальности у тебя код исполняется.
(Что и в каком порядке).
Из-за Task.Run - не известно, когда на самом деле оно всё завершается.
Может быть даже не кэширование, а просто транзакция.
Например если на читающем контексте транзакция началась раньше, чем было сделано сохранение в пишущем - тогда сама база может отдать старые данные.
Точно ли нужно все 5 уровней? Или может можно как-то развернуть в более плоскую структуру?
Если это прям дерево-дерево, то можно сделать какой-нибудь вложенный в таблицу treeview
MaminProgrammist, посмотрел ещё, как в VK похожий элемент сделан. Там треугольник тоже отдельно идёт, но он реализован как-то через ::after и border, Но как это работает я не понял
MaminProgrammist, имею в виду, что рисовать не один только треугольник, а всю фигуру целиком. https://bennettfeely.com/clippy/
Сам далёк от фронта, но кажется, что с помощью этого это возможно.