计算进度百分比

时间:2011-08-27 21:15:44

标签: c#

我正在使用webclient来降级文件。我正在计算进度百分比如下

  1. 我知道要下载的文件的文件大小(我从数据库表中读取)。

  2. 我依赖WebClient的BytesRecieved属性来了解下载过程中获取的总字节数。

  3. 我使用的算法是double dProgress = (e.BytesReceived / FileSize)*100);来计算进度百分比。

  4. 但是我没有获得更新进度条的正确进度百分比。

    有没有计算进度百分比的方法?

6 个答案:

答案 0 :(得分:24)

请看以下行: double dProgress = (e.BytesReceived / FileSize)*100)

如果e.BytesReceivedFileSize都是整数,那么您将始终拥有0 * 100 = 0

做这样的事情:

double dProgress = ((double)e.BytesReceived / FileSize)*100.0

这是因为/在分割两个整数时进行整数除法。但你不希望如此。因此,您将其中一个变量转换为double

答案 1 :(得分:3)

如果您在进行异步下载时正在处理DownloadProgressChanged事件,则事件args上已经有ProgressPercentage,因此重新发明它没有意义。一个人为的例子:

var client = new WebClient();
var reset = new ManualResetEvent(false);
client.DownloadProgressChanged += (s, e) => Console.WriteLine("{0} percent complete", e.ProgressPercentage);
client.DownloadFileCompleted += (s, e) => reset.Set();
client.DownloadFileAsync(new Uri("http://myfilepathhere.com"), "file.name");
//Block till download completes
reset.WaitOne();

答案 2 :(得分:1)

BytesReceived和FileSize很可能是整数,因此您需要以这种方式计算进度:

double dProgress = 100.0 * e.BytesReceived / FileSize;

答案 3 :(得分:1)

问题是这两个数字都是整数。当你划分它们时,它们会小于1,所以它们向下舍入到0.对它们进行轮询以使结果浮动:

double dProgress = ((double)e.BytesReceived / FileSize)*100)

答案 4 :(得分:1)

这是C#中基本算术和转换的一个非常棘手的问题。

解决方案

首先将整数除法的结果存储在double变量中。然后输入转换为整数。

int x = 5, y = 10, answer;
double ansDouble;
answer = (int)(x / y) * 100; //percentage calculation
Console.WriteLine("percentage={0}", answer);
//>output percentage=0

answer = (int)((double)x / y) * 100; //percentage calculation
Console.WriteLine("percentage={0}", answer);
//>output percentage=0

answer = (int)((double)x / (double)y) * 100; //percentage calculation
Console.WriteLine("x={0}", answer);
//>output percentage=0

answer = (int)(x/(double)y) * 100; //percentage calculation
Console.WriteLine("x={0}", answer);
//>output percentage=0

ansDouble = ((double)x / y) * 100;
answer = (int)ansDouble;
Console.WriteLine("percentage={0}", answer);
//>output percentage=50

注意事项

对于x和y的任何值,只要它们是整数,则结果是x / y = 0 我们无法通过任何投射组合在一行中解决这个问题

答案 5 :(得分:0)

试试这个:

WebClient Client = new WebClient();
Client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged);

...

  void ProgressChanged(object sender, DownloadProgressChangedEventArgs e) {

            double bytesIn = double.Parse(e.BytesReceived.ToString());
            double totalBytes = double.Parse(e.TotalBytesToReceive.ToString());
            double percentage = bytesIn / totalBytes * 100;
            int percente = int.Parse(Math.Truncate(percentage).ToString());
            progressBar.Value = percente;
        }

或者只使用ProgressPercentage值。

 void ProgressChanged(object sender, DownloadProgressChangedEventArgs e) {
           progressBar.Value = e.ProgressPercentage; 
  }