【问题标题】:Help with downloading with progressbar使用进度条帮助下载
【发布时间】:2011-02-17 21:43:29
【问题描述】:

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

在 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";
}

【问题讨论】:

  • 一般情况下,不要显式启动线程,使用线程池中的后台线程。使用 QueueUserWorkItem 或其他依赖于池的调用来执行此操作。 stackoverflow.com/questions/684640/…

标签: c#


【解决方案1】:

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

另外,这也是DownloadProgressChanged 事件没有触发的原因:

它仅适用于异步调用(link)

【讨论】:

    【解决方案2】:

    我不知道为什么没有提出它们,但问题是,您正试图从非 UI 线程更新 UI。
    怎么做,可以看这里:How to update the GUI from another thread in C#?

    【讨论】:

    • 我添加了委托,但它仍然没有触发事件......我仍然看到 foo.iso 增加:(
    • @Jason94:问题是这些事件不适用于DownloadFile 呼叫。看我的回答……
    • 这个问题的答案在digEmAll的答案中
    猜你喜欢
    • 1970-01-01
    • 2017-12-05
    • 1970-01-01
    • 1970-01-01
    • 2021-08-26
    • 2014-03-13
    • 1970-01-01
    • 2019-05-26
    • 1970-01-01
    相关资源
    最近更新 更多