Size: a a a

var chat = new Chat();

2021 February 04

VL

Vova Lantsov in var chat = new Chat();
Костя К.
Всем привет.
Кто-нибудь может помочь с багой связаной с BackgroundService?
У меня есть hosted BackgroundService, который циклически проверяет синглтон очередь BackgroundTaskQueue (внутри которой ConcurrentQueue<Func<CancellationToken, Task>> queue) и запускает таски оттуда.
Внутри контроллеров при необходимости в очередь скидываются лямбды:
this.item1PublishBackgroundTaskQueue.QueueBackgroundWorkItem(
 async cancellationToken => { await publishItem1AppServ.Publish(item1).ConfigureAwait(false); }):

Это один пример, а в других что-то подобное:
async cancellationToken => { await publishItem1AppServ.Publish(item1).ConfigureAwait(false); }
async cancellationToken => { await publishItem2AppServ.Publish(item2).ConfigureAwait(false); }
async cancellationToken => { await publishItem3AppServ.Publish(item3).ConfigureAwait(false); }

В контроллерах publishItem..AppServ инжектяться (Transient). А в сами реализации этих сервисов могут инжектится автомаппер, и другие сервисы, которые явно инжектятся (Transient).

Падает ошибка при попытке воспользоваться кастомным ValueResolver - Cannot access a disposed object. Object name: 'IServiceProvider'. System.ObjectDisposedException.

Есть мысли что нужно обрабатывать таски из очереди внутри скоупа IServiceScopeFactory (добавленого в BackgroundService), но не могу понять а что вообще вытягивать из скоупа, если в очередь могут приходить любые сервисы.
Any ideas?)
Покажи плиз логику обработки где идёт обращение к этим сервисам
источник

VL

Vova Lantsov in var chat = new Chat();
Я так понимаю сервисы ты запрашиваешь в конструкторе контроллера, а обрабатывать хочешь в фоне
источник

КК

Костя К. in var chat = new Chat();
Vova Lantsov
Я так понимаю сервисы ты запрашиваешь в конструкторе контроллера, а обрабатывать хочешь в фоне
да. так и есть
источник

КК

Костя К. in var chat = new Chat();
Vova Lantsov
Покажи плиз логику обработки где идёт обращение к этим сервисам
BackgroundTaskQueueHostedService : BackgroundService
{
 private readonly IBackgroundTaskQueue backgroundTaskQueue;
 protected override async Task ExecuteAsync(CancellationToken stoppingToken)
       {
           while (!stoppingToken.IsCancellationRequested)
           {
               var backgroundWorkItem = await this.backgroundTaskQueue.DequeueBackgroundWorkItemAsync(stoppingToken).ConfigureAwait(false);

               try
               {
                   await backgroundWorkItem(stoppingToken).ConfigureAwait(false);
               }
               catch (Exception exception)
               {
                   this.logger.LogError(LogEventId.BackgroundTaskQueueHostedService, exception, "BackgroundTaskQueueHostedService");
               }
           }
       }
}

   
public class BackgroundTaskQueue : IBackgroundTaskQueue, IDisposable
{
 private readonly ConcurrentQueue<Func<CancellationToken, Task>> backgroundWorkItems = new ConcurrentQueue<Func<CancellationToken, Task>>();
 public async Task<Func<CancellationToken, Task>> DequeueBackgroundWorkItemAsync(CancellationToken cancellationToken)
       {
           await this.signal.WaitAsync(cancellationToken).ConfigureAwait(false);

           this.backgroundWorkItems.TryDequeue(out var backgroundWorkItem);

           return backgroundWorkItem;
       }
}
источник

КК

Костя К. in var chat = new Chat();
Сорри, апдейтнул сейчас - как оно деве работает.
Убрал свои редактирования
источник

VL

Vova Lantsov in var chat = new Chat();
Костя К.
Всем привет.
Кто-нибудь может помочь с багой связаной с BackgroundService?
У меня есть hosted BackgroundService, который циклически проверяет синглтон очередь BackgroundTaskQueue (внутри которой ConcurrentQueue<Func<CancellationToken, Task>> queue) и запускает таски оттуда.
Внутри контроллеров при необходимости в очередь скидываются лямбды:
this.item1PublishBackgroundTaskQueue.QueueBackgroundWorkItem(
 async cancellationToken => { await publishItem1AppServ.Publish(item1).ConfigureAwait(false); }):

Это один пример, а в других что-то подобное:
async cancellationToken => { await publishItem1AppServ.Publish(item1).ConfigureAwait(false); }
async cancellationToken => { await publishItem2AppServ.Publish(item2).ConfigureAwait(false); }
async cancellationToken => { await publishItem3AppServ.Publish(item3).ConfigureAwait(false); }

В контроллерах publishItem..AppServ инжектяться (Transient). А в сами реализации этих сервисов могут инжектится автомаппер, и другие сервисы, которые явно инжектятся (Transient).

Падает ошибка при попытке воспользоваться кастомным ValueResolver - Cannot access a disposed object. Object name: 'IServiceProvider'. System.ObjectDisposedException.

Есть мысли что нужно обрабатывать таски из очереди внутри скоупа IServiceScopeFactory (добавленого в BackgroundService), но не могу понять а что вообще вытягивать из скоупа, если в очередь могут приходить любые сервисы.
Any ideas?)
Есть следующие варианты:
1) сделай все сервисы publishItem1AppServ, publishItem2AppServ и т.д. как singleton, а внутри них из конструктора получай IServiceProvider и создавай скоуп в методе Publish (пишу с памяти, код может быть неправильным)
using (IServiceScope scope = serviceProvider.CreateScope())
{
   IServiceProvider scopedServices = scope.ServiceProvider;
   // тут можешь вытянуть сервисы - scopedServices.GetRequiredService<TService>(); и так для каждого сервиса
}
2) Управляй сервисами в лямбде (и соответственно не вытягивай из конструктора контроллера)
async (serviceProvider, cancellationToken) =>
{
   var publishItem1AppServ = serviceProvider.GetRequiredService<TService>();
   await publishItem1AppServ.Publish(item1);
}
источник

КК

Костя К. in var chat = new Chat();
Спасибо! Попробую
источник

Б

Бунтарь in var chat = new Chat();
Подскажите пожалуйста правильную форму записи подсчета в массиве с крайней ячейки.
пишу array[^i+1] студия ругается.

i = 0
+1 пишу, т.к. если не ошибаюсь с конца исчисление начинается с 1, а не с 0
источник

В

Владислав in var chat = new Chat();
[^(i+1)] может?
источник

Б

Бунтарь in var chat = new Chat();
попробую
источник
2021 February 05

Б[

Барсик [SpamBlock]... in var chat = new Chat();
бот?
источник

а

аноним in var chat = new Chat();
нет
источник

A

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

а

аноним in var chat = new Chat();
Aleksey
так бы и ответил бот
Тс..
источник

Я

Ярослав in var chat = new Chat();
Кто-то в тестах файлы и папки мокал?
источник

Я

Ярослав in var chat = new Chat();
вроде нашел что нужно юзать System.IO.Abstractions

сделал сетап для моего кейса File.Exists(), чтобы возвращало тру, а оно всё равно туда заползает
источник

АК

Антон Камышенков... in var chat = new Chat();
В вакансиях часто пишут про опыт оптимизации запросов ,что подразумевается под этим ? К примеру такой запрос нуждается в оптимизации ? Какие инструменты для оптимизации используются ?
источник

АК

Антон Камышенков... in var chat = new Chat();
источник

АК

Антон Камышенков... in var chat = new Chat();
источник

VL

Vova Lantsov in var chat = new Chat();
Антон Камышенков
В вакансиях часто пишут про опыт оптимизации запросов ,что подразумевается под этим ? К примеру такой запрос нуждается в оптимизации ? Какие инструменты для оптимизации используются ?
Подразумевается что ты взял запрос и ускорил его в N раз. А вот какой запрос нужно оптимизировать и каким образом - я хз, наверное из опыта и методом тыка
источник