Чтение канала работает некоторое время, затем происходит сбойC#

Место общения программистов C#
Ответить
Anonymous
 Чтение канала работает некоторое время, затем происходит сбой

Сообщение Anonymous »

У меня есть долгоработающий класс (не BackgroundService), у которого есть внутренний канал, который я использую для буферизации входящих запросов.
Существует метод 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));
Как выглядит _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;
}
}
Некоторое время это работает отлично (несколько часов при очень небольшой загрузке сообщений), а затем прекращается. Согласно журналам, запись все еще происходит, но сторона чтения зависает.
Нет сообщений журнала, связанных с ошибками чтения, возникновением исключений и т. д. Просто кажется, что цикл чтения чтобы остановиться.
Я пробовал несколько комбинаций Bounded/Unbounded, TryRead и ReadAsync, каждая из которых дала примерно одинаковые результаты. Записи все еще происходят (что означает, что объект жив и здоров), но безуспешно.
Большинство документов, похоже, не намекают на это, но я полагаю, что я Я делаю что-то не по назначению, или где-то ошибка. Другие каналы, которые я использую в приложении, работают нормально, но на уровне HostedService они являются одиночными.
Кто-нибудь сталкивался с чем-то подобным?

Подробнее здесь: https://stackoverflow.com/questions/792 ... then-fails
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»