2014-09-10 39 views
0

我想让进度条为下载变化的百分比运行时文件,进度与百分比在网页.aspx文件

我有代码,但运行时它会不会改变进度条的值

然后下载完成进度条直接进入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

我相信你的问题是在这里:

double percentage = bytesIn/totalBytes * 100 

应该是:

double percentage = (bytesIn/totalBytes) * 100 

第一部分始终不可分割的一部分= 0

这意味着:

Math.Truncate(bytesIn/totalBytes * 100) 

会给你0

2

在ASP.NET中,像这样的服务器端代码在返回到客户端之前在页面请求中的服务器上完全评估。您的进度条直接转到100%,因为在您看到页面上的任何内容之前,转帐已完成100%。

在设置百分比的调试器中添加一些日志记录或添加一个断点,并且在传输足够大/较慢时,您会看到您的进度正在被正确更新。您在浏览器中看不到它,因为在发生这种情况时,客户端没有任何操作可以更新浏览器。直到完成传输文件并因此设置为100%之后,才会出现浏览器呈现。

我建议刷上ASP.NET page life cycle,这样你就可以更好地理解为什么会发生这种情况。您的Button1_Click是回发事件,因此它在页面呈现前处理。

为了在传输过程中看到进度更新,您需要使用AJAX更复杂的策略。有几种不同的方法可以在ASP.NET中实现。

下面是使用的UpdatePanel从微软的例子:

http://www.asp.net/ajaxlibrary/jquery_ui_mvc_progressbar.ashx

http://msdn.microsoft.com/en-us/library/vstudio/bb386421(v=vs.100).aspx

下面是另一个例子用jQuery做它在一个较低的水平