在网页.aspx文件中具有百分比的进度条

时间:2014-09-10 13:17:02

标签: c#

我想通过更改百分比运行时间来下载文件的进度条,

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

然后下载完成,进度条直接转到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);
}

2 个答案:

答案 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