c# - 每 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;
}
}
}
到目前为止,我找不到解决方案。
解决方案
您可以跟踪要记录的下一个“步骤”百分比:
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)
推荐阅读
- php - 如何在wordpress的菜单中隐藏子类别并只保留类别?
- c++ - C++中指针类型的限制
- c++ - 如何在 C++ 的二维数组中进行切片操作,与 Python 相同
- arrays - 单击like按钮后,我想重新加载特定的 UITableView 行
- c++ - 理解malloc参数大小的问题
- javascript - Service Worker 返回 javascript 文件的脱机 html 页面
- visual-studio - Visual Studio 单元测试文件非常大。如何最好地分解它?
- sql - SQL - 成对的时间序列事件
- jmeter - 有人可以分享 Locust 测试结果与 jmeter 测试不同的原因吗?
- java - 为什么一些java程序中的类实现了一个空接口?