C#上传文件至FTP时在Label中显示上传百分比功能失效如何解决
代码核心问题
- 整数除法导致精度丢失:代码中
PrgBar.Value与PrgBar.Maximum均为整数类型,C# 中两个整数执行除法运算时会默认舍去小数部分,例如进度到99%时,99/100的运算结果为0,只有当上传完全完成时才会得到1,因此百分比永远只会显示0%或100%,无法展示中间进度。 - 可选优化点:每次写入10KB数据就触发一次UI线程Invoke调用,大文件上传时会频繁占用UI线程资源,容易导致界面卡顿,可适当增加每次更新的间隔阈值再触发UI更新。
修复代码
修改百分比计算逻辑,先将其中一个值转为浮点类型再进行运算即可:
{ PrgBar.Invoke( (MethodInvoker)delegate { PrgBar.Maximum = (int)fileStream.Length; }); byte[] buffer = new byte[10240]; int read; // 可选:增加累计计数,降低UI更新频率 long totalRead = 0; long lastUpdateBytes = 0; const long updateThreshold = 1024 * 100; // 每上传100KB更新一次UI while ((read = fileStream.Read(buffer, 0, buffer.Length)) > 0) { ftpStream.Write(buffer, 0, read); totalRead += read; // 阈值判断,避免频繁更新UI if (totalRead - lastUpdateBytes >= updateThreshold || totalRead == fileStream.Length) { PrgBar.Invoke((MethodInvoker)delegate { PrgBar.Value = (int)fileStream.Position; // 修正整数除法问题,先转浮点再计算 int percent = (int)Math.Round((double)PrgBar.Value / PrgBar.Maximum * 100); LblPercent.Text = percent.ToString() + "%"; }); lastUpdateBytes = totalRead; } } }
内容的提问来源于stack exchange,提问作者Arik m
相关产品推荐
相关产品推荐

