首页 > 解决方案 > 每 n 次 C# 记录百分比进度

问题描述

我正在下载/上传文件,我需要记录进度,现在我正在记录进度的百分比,但我的问题是它打印的行太多,最多可能需要 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;
                }
            }
}

到目前为止,我找不到解决方案。

标签: c#logging.net-coreprogress-barpercentage

解决方案


您可以跟踪要记录的下一个“步骤”百分比:

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)


推荐阅读