我正在使用webclient来降级文件。我正在计算进度百分比如下
我知道要下载的文件的文件大小(我从数据库表中读取)。
我依赖WebClient的BytesRecieved
属性来了解下载过程中获取的总字节数。
我使用的算法是double dProgress = (e.BytesReceived / FileSize)*100);
来计算进度百分比。
但是我没有获得更新进度条的正确进度百分比。
有没有计算进度百分比的方法?
答案 0 :(得分:24)
请看以下行:
double dProgress = (e.BytesReceived / FileSize)*100)
如果e.BytesReceived
和FileSize
都是整数,那么您将始终拥有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;
}