#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)