Существует метод Enqueue, а именно:
Код: Выделить всё
public async Task Enqueue(IMessage message)
{
bool result;
try
{
if (_cts.IsCancellationRequested)
{
_logger.LogInformation("{TypeName} cannot be enqueued because the queue is stopped.", message.GetType().Name);
result = false;
}
else
{
await _messageChannel.Writer.WriteAsync(message);
result = true;
_logger.LogInformation("Message {TypeName} written to internal channel.", message.GetType().Name);
}
}
catch (ChannelClosedException)
{
_logger.LogInformation("{TypeName} cannot be enqueued because the channel is closed.", message.GetType().Name);
result = false;
}
catch (Exception e)
{
_logger.LogError(e, "Error enqueuing {TypeName}", message.GetType().Name);
result = false;
}
return result;
}
Код: Выделить всё
Task.Run(() => _MainMessageLoop(_cts.Token));Код: Выделить всё
private async Task _MainMessageLoop(CancellationToken stoppingToken)
{
try
{
var channelReader = _messageChannel.Reader;
while (await channelReader.WaitToReadAsync(stoppingToken).ConfigureAwait(false))
{
try
{
var item = await channelReader.ReadAsync(stoppingToken).ConfigureAwait(false);
_logger.LogInformation("Message {TypeName} read from internal channel.", item.GetType().Name);
await _DoSomethingAsync(item);
}
catch (Exception e)
{
_logger.LogError(e, "Error doing something");
}
}
_logger.LogInformation("Channel reader loop exited {MethodName}.", nameof(_MainMessageLoop));
}
catch (OperationCanceledException)
{
_logger.LogDebug("OperationCanceled {MethodName}", nameof(_MainMessageLoop));
throw;
}
catch (Exception e)
{
_logger.LogError(e, "Error in {MethodName}", nameof(_MainMessageLoop));
throw;
}
}
Нет сообщений журнала, связанных с ошибками чтения, возникновением исключений и т. д. Просто кажется, что цикл чтения чтобы остановиться.
Я пробовал несколько комбинаций Bounded/Unbounded, TryRead и ReadAsync, каждая из которых дала примерно одинаковые результаты. Записи все еще происходят (что означает, что объект жив и здоров), но безуспешно.
Большинство документов, похоже, не намекают на это, но я полагаю, что я Я делаю что-то не по назначению, или где-то ошибка. Другие каналы, которые я использую в приложении, работают нормально, но на уровне HostedService они являются одиночными.
Кто-нибудь сталкивался с чем-то подобным?
Подробнее здесь: https://stackoverflow.com/questions/792 ... then-fails
Мобильная версия