Читать канал работает на некоторое время, а затем терпит неудачуC#

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

Сообщение Anonymous »

У меня есть длительный класс (не фоновое обслуживание), в котором есть внутренний канал, который я использую для буфера входящих запросов.

Код: Выделить всё

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
Ответить

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

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

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

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

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