#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>
в своем контейнере DI2. @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);