我想通过更改百分比运行时间来下载文件的进度条,
我有代码,但运行时间不会改变进度条的值
然后下载完成,进度条直接转到100%。
请建议我代码,因为她是我的示例代码。
private void DownloadFile(string url)
{
WebClient client = new WebClient();
client.UseDefaultCredentials = true;
client.DownloadProgressChanged += client_DownloadProgressChanged;
client.DownloadFileCompleted += new System.ComponentModel.AsyncCompletedEventHandler(client_DownloadFileCompleted);
// var url = _downloadUrls.Dequeue();
string FileName = url.Substring(url.LastIndexOf("/") + 1,
(url.Length - url.LastIndexOf("/") - 1));
client.DownloadFileAsync(new Uri(url), Server.MapPath(".") + "\\" + FileName);
//lblFileName.Text = url;
return;
}
void client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
double bytesIn = double.Parse(e.BytesReceived.ToString());
double totalBytes = double.Parse(e.TotalBytesToReceive.ToString());
double percentage = bytesIn / totalBytes * 100;
Label1.Text = "test";
//prg.Percentage = Convert.ToInt32(percentage);
prg.Percentage = int.Parse(Math.Truncate(percentage).ToString());
}
protected void Button1_Click(object sender, EventArgs e)
{
DownloadFile(Sample URL);
}
答案 0 :(得分:2)
使用ASP.NET,在返回客户端之前,在页面请求中的服务器上完全评估这样的服务器端代码。您的进度条直接转到100%,因为在您在页面上看到任何内容之前,转移已完成100%。
在您设置百分比的调试器中添加一些日志记录或添加断点,并且通过足够大/慢的传输,您将看到您的进度正在正确更新。您没有在浏览器中看到它,因为在发生这种情况时,客户端上没有任何内容可以更新浏览器。在完成文件传输之后,浏览器渲染才会发生,因此设置为100%。
我建议刷新ASP.NET page life cycle,这样你就可以更好地理解为什么会这样。 Button1_Click是一个回发事件,因此在页面呈现之前处理它。
为了在转移发生时看到进度更新,您需要使用AJAX的更复杂的策略。在ASP.NET中实现此方法有几种不同的方法。
以下是Microsoft使用UpdatePanel的示例:
http://msdn.microsoft.com/en-us/library/vstudio/bb386421(v=vs.100).aspx
这是另一个使用jquery在较低级别执行此示例的示例:
http://www.asp.net/ajaxlibrary/jquery_ui_mvc_progressbar.ashx
答案 1 :(得分:0)
我相信你的问题在这里:
double percentage = bytesIn / totalBytes * 100
应该是:
double percentage = (bytesIn / totalBytes) * 100
第一部分始终是整数部分= 0
这意味着:
Math.Truncate(bytesIn / totalBytes * 100)
会给你0