Основной канал .Net в фоновых задачах

#c# #.net-core #channel

#c# #.net-core #канал

Вопрос:

Я хочу использовать chanel в backgroundservice, но у меня возникает эта ошибка при запуске моего кода, что мне нужно сделать.

Извините за плохой английский

Не удалось разрешить службу для типа ‘System.Многопоточность.Каналы.ChannelReader `1 [SendMailChanel]’ при попытке активировать ‘SendEmailService’

 public class SendMailChanel
    {
        public List<SendMail> SendMails { get; set; }
        public List<string> MailTos { get; set; }
    }

public class SendEmailService: BackgroundService
{
      
        private readonly ChannelReader<SendMailChanel> _channel;

        public HostedService(         
            ChannelReader<SendMailChanel> channel)
        {
            _channel = channel;
        }

        protected override async Task ExecuteAsync(CancellationToken cancellationToken)
        {
            await foreach (var item in _channel.ReadAllAsync(cancellationToken))
            {
                try
                {
                    // do your work with data
                }
                catch (Exception e)
                {
                    
                }
            }
        }
}

[ApiController]
[Route("api/data/upload")]
public class UploadController : ControllerBase
{
    private readonly ChannelWriter<SendMailChanel> _channel;

    public UploadController (
        ChannelWriter<SendMailChanel> channel)
    {
        _channel = channel;
    }

    public async Task<IActionResult> Upload([FromForm] FileInfo fileInfo)
    {
        SendMailChanel mailChanel = new SendMailChanel();
        mailChanel.SendMails = lstSendMail;
        mailChanel.MailTos = lstEmailTo;
        await _channel.WriteAsync(mailChanel);

        return Ok();
    }
}

Startup.cs
services.AddHostedService<SendEmailService>();
  

Комментарии:

1. Вы не зарегистрировали экземпляр Channel<SendMail> в своем контейнере DI

2. @JohanP как это сделать, сэр, я слишком много гуглю, но ничего не нашел, вот что я попробовал: 1. общедоступный интерфейс IChannelReader 2. общедоступный почтовый сервис (конфигурация MySettingsConfiguration, IChannelReader chanel) 3. сервисы. AddSingleton<IChannelReader, SendMailChanel>(); но ошибка throw не может привести объект … к …

Ответ №1:

следуйте этому руководству

https://flerka.github.io/personal-blog/2020-01-23-communication-with-hosted-service-using-channels/

     services.AddHostedService<SendEmailService>();
    services.AddSingleton<Channel<SendMailChanel>>(Channel.CreateUnbounded<SendMailChanel>(new UnboundedChannelOptions() { SingleReader = true }));
    services.AddSingleton<ChannelReader<SendMailChanel>>(svc => svc.GetRequiredService<Channel<SendMailChanel>>().Reader);
    services.AddSingleton<ChannelWriter<SendMailChanel>>(svc => svc.GetRequiredService<Channel<SendMailChanel>>().Writer);