c# - 帮助下载进度条

标签 c#

我试图制作一个简单的下载器,但我无法更新我的表单 (Form1) 中的 GUI 元素。

在 Form1 的构造函数中,我调用线程:

        Thread t = new Thread(new ThreadStart(fetch));
        t.Start();

fetch 看起来像这样:

private void fetch()
{
        try
        {
            WebClient webClient = new WebClient();
            webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(webClient_DownloadProgressChanged);
            webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(webClient_DownloadFileCompleted);
            webClient.DownloadFile(updateurl, @"foo.iso");
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message + "\n\n" + ex.InnerException.ToString());
        }
}

没有任何事件被触发...不过,通过查看文件夹中的 foo.iso,我发现文件大小增加了。

其中一个事件如下所示:

void webClient_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{   
    progressBar.Value = (int)(e.BytesReceived * 100 / e.TotalBytesToReceive);

    statusLabel.Text = "Downloading";
    descLabel.Text = progressBar.Value + " % complete";
}

最佳答案

您不需要在另一个线程中执行您的fetch 方法,只需使用DownloadFileAsync而不是 DownloadFile,它应该异步工作。

此外,这就是为什么 DownloadProgressChanged 事件没有触发的原因:

它只适用于异步调用 (link) .

关于c# - 帮助下载进度条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5029505/

相关文章:

c# - 使用嵌套母版页

c# - 过于复杂的工厂方法 - 任何解决方案?

c# - 非泛型类是否可能包含 .NET(C# 或 VB.NET)中的泛型列表?

c# - 如何在具有自己的用户类型的延迟加载属性上激活二级缓存?

c# - 如何知道查询是否成功?

c# - 如何让 AutoFixture AutoMoq 从实例化对象中的注入(inject)服务返回结果?

c# - DatagridView 复选框已选中?

c# - 从 HTML 帮助程序中提取显示名称和描述属性

c# - 寻找半小时向上/向下的时间选择器控制

c# - 在c#中监控mysql数据库