计算进度百分比
我正在使用webclient来dowlnoad文件。我正在计算进度百分比如下计算进度百分比
我知道将要下载的文件的文件大小(我从数据库表中读取)。
我依赖于WebClient的
BytesRecieved
属性来知道在下载过程中获取的总字节数。我使用的算法是
double dProgress = (e.BytesReceived/FileSize)*100);
来计算进度百分比。
但是我没有得到正确的进度百分比来更新进度栏。
是否有任何方法来计算进度百分比?
看看下面的一行: double dProgress = (e.BytesReceived/FileSize)*100)
如果同时e.BytesReceived
和FileSize
是整数,那么你将永远有0 * 100 = 0
。
使事情是这样的:
double dProgress = ((double)e.BytesReceived/FileSize)*100.0
这是因为/
做整数除法将两个整数的时候。但你不想那样。所以你将其中一个变量转换为double
。
我用你的代码,发现代码正确生成。但是进度条仅填充四分之一。我使用的最小值为1,最大值为100.最小步长为0.1,最大步长为1.0.any想法? – logeeks
,并与BytesReceived最文件大小大概为整数,所以你需要计算的进展是这样的:
double dProgress = 100.0 * e.BytesReceived/FileSize;
的问题是,这两个数字都是整数。当你devide他们,他们变得比1小,因此他们本轮下跌到0强制转换他们做出结果的浮动:
double dProgress = ((double)e.BytesReceived/FileSize)*100)
如果你正在做一个异步下载,事件参数时处理DownloadProgressChanged
事件已经有一个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();
+ 1,伟大的作品:) –
我越来越e.Progresspercentage始终为0,所以我寻找替代方法 – logeeks
试试这个:
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;
}
我知道我一年半迟了,但我必须回应这一点。这是** double.Parse(e.BytesReceived.ToString())**拖动或者你不知道什么是类型转换? – mnn
这是一个非常棘手的问题,在C#中进行基本的算术运算和转换。
解决方案
首先将整数除法的结果存储在双变量中。然后键入将其转换为整数。
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 = 0时,x和y的任何值,只要它们是整数 我们不能在一行中任何铸造组合解决这个
你有什么代码? –
对不起,我没有得到你刚刚告诉的。 – logeeks
你怎么知道这是错的?它总是一样吗? 0?喃? > 100?负?确切的问题是什么? – Cameron