Код: Выделить всё
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;
}
< /code>
В конструкторе класса цикл чтения сообщений запускается с помощью: < /p>
Task.Run(() => _MainMessageLoop(_cts.Token));где _mainmessageLoop выглядит так:
Код: Выделить всё
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;
}
}
Не существует сообщений журналов, связанных с неудачами чтения, исключениями, брошенными и т. Д. Цикл чтения, кажется, просто останавливается.
Я пробовал несколько комбинаций ограниченных/неограниченных, попробуйте vs. redectync , каждая из них, каждая из них, каждая из них, каждая из них, каждая из них. Записи все еще происходят (что означает, что объект жив и здоров), без какой -либо удачи. Другие каналы, которые я использую в приложении, работают нормально, но они синглтоны на уровне HostedService.>
Подробнее здесь: https://stackoverflow.com/questions/792 ... then-fails
Мобильная версия