2014-09-10 59 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做它在一個較低的水平