C # процент протоколирования прогресса каждый n-й

#c# #logging #.net-core #progress-bar #percentage

#c# #протоколирование #.net-ядро #индикатор выполнения #процент

Вопрос:

Я загружаю / загружаю файл, и мне нужно регистрировать прогресс в этом, прямо сейчас я регистрирую процент этого прогресса, но моя проблема в том, что он печатает слишком много строк, он может занимать до 100 строк всего 0,04% .. 0,06% и т.д. Что мне нужно, так это регистрировать каждые 5% прогресса, чтобы это было 0% 5% 10% 15%… 95% 100%.

 public async Task Send(IChannelHandlerContext ctx, byte[] fileBytes, CancellationToken ct)
{
            var offset = 0;
            var buffer = new ArraySegment<byte>(fileBytes);
            while (true)
            {
                var segment = buffer.GetSegment(offset, 1024);
                offset  = segment.Count;

                var packet = new DataTransferPacket(segment).Serialize(ctx.Allocator.Buffer());
                await ctx.WriteAndFlushAsync(packet);

                var progress = Math.Round((double) offset / fileBytes.Length * 100);

                if (progress % 5 == 0)
                { 
                    var byteProgress =
                    $"[{offset.ToString().PadLeft(fileBytes.Length.ToString().Length)} / {fileBytes.Length} Bytes]";
                    _logger.LogInformation($"Uploading {progress,6:0.00}% {byteProgress,12}");
                }

                await Task.Delay(100, ct);
                if (offset == fileBytes.Length)
                {
                    return;
                }
            }
}
 

До сих пор я не мог найти решение этой проблемы.

Ответ №1:

Вы можете просто отслеживать, какой процент является следующим «шагом», который вы хотите зарегистрировать:

 public async Task Send(IChannelHandlerContext ctx, byte[] fileBytes, CancellationToken ct)
{
    var offset = 0;
    var buffer = new ArraySegment<byte>(fileBytes);
    var nextLogThresh = 0; // <== new line
    while (true)
    {
        var segment = buffer.GetSegment(offset, 1024);
        offset  = segment.Count;

        var packet = new DataTransferPacket(segment).Serialize(ctx.Allocator.Buffer());
        await ctx.WriteAndFlushAsync(packet);

        var progress = Math.Round((double) offset / fileBytes.Length * 100);

        if (progress >= nextLogThresh) // <== new line
        { 
            var byteProgress =
            $"[{offset.ToString().PadLeft(fileBytes.Length.ToString().Length)} / {fileBytes.Length} Bytes]";
            _logger.LogInformation($"Uploading {progress,6:0.00}% {byteProgress,12}");
            nextLogThresh  = 5; // <== new line
        }

        await Task.Delay(100, ct);
        if (offset == fileBytes.Length)
        {
            return;
        }
    }
}
 

Конечно, это не будет регистрировать последние «100%», поэтому, если вы хотите, вам нужно будет добавить дополнительный _logger.LogInformation(...) внутри if (offset == fileBytes.Length)