首页 > 解决方案 > 无法使用 DownloadProgressChangedEventHandler 更新文本框

问题描述

我正在尝试使用 WebClient 和多线程从 url 下载文件。我正在尝试在下载文件时获取 ProgressPercentage,我正在尝试使用 DownloadProgressChanged 来做到这一点,但是当我尝试使用 debug.WriteLine 打印百分比时,一切正常。但是当我想更改我的 textbox.text 时,它不起作用。我想在下载时更新我的​​文本框。

有了这个,我正在调用一个函数。 wc.DownloadProgressChanged += new DownloadProgressChangedEventHandler(DownloadProgressChangedEventHandler);

这是函数的内容:

 public void DownloadProgressChangedEventHandler(object sender, DownloadProgressChangedEventArgs e)
    {
        //Debug.WriteLine works normal.
        Debug.WriteLine(e.ProgressPercentage);
        TextBox1.Text = "Progress:" +e.ProgressPercentage.ToString();
        progressBarDownload3.Style.Add("width",e.ProgressPercentage.ToString()+"%");
    }

标签: asp.netwebforms

解决方案


从技术上讲,虽然如果您在桌面或移动应用程序上工作,但如果您使用 ASP.NET 服务器端组件并且您的服务器在回发页面时正在为您下载某些内容,那么上述解决方案可能很有用,那么有在下载完成并将响应发送回请求客户端之前,前端无法更新。这就是整点,发送到服务器的每个请求只有在响应完成/中断后才会返回,它不能仅仅为了报告进度然后返回到它运行的点而返回。

如果您想显示正在下载的文件的进度,那么您应该选择基于客户端 ( JavaScript/jQuery) 的解决方案。

如果您确实想用C#代码下载文件然后尝试签出SignalR库,这可能有助于您将后端的更改报告给前端,但同时,仅报告下载进度管理起来会很复杂.

或者,您可以将浏览器扔到下载 url,它会自动为客户端下载文件,并且下载文件的客户端可以看到浏览器的默认下载进度条。

无论如何,您都无法从服务器下载文件并byte使用 C# 和 ASP.NET WebForms/MVC 将下载的每个文件报告到前端。除非您在操作中包含 jquery/javascript。


推荐阅读