从不同的对象/类更新GUI上的进度条

时间:2014-05-28 21:48:43

标签: c#

我有一个管理从特定资源下载文件的类。该类在GUI线程中实例化。例如,该类称为MP3Download

MP3Downloader内我有一个名为DownloadFile的方法:

public async Task DownloadFIle(string url, string path)
{
    using (WebClient client = new WebClient())
    {
            client.DownloadProgressChanged += (s, e) =>
            {
                Console.WriteLine("Changed");
            };

            try
            {
                await client.DownloadFileTaskAsync(url, path);
            } catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }

        }

}

我在GUI上有一个进度条。我想知道如何将下载进度报告回进度条。

我是否必须在MP3Downloader类中创建一个事件并从GUI订阅该事件?当DownloadProgressChanged被解雇时,我将发件人和事件参数传递给我的自定义事件?

我不想将进度条与MP3Downloader课程结合起来。

2 个答案:

答案 0 :(得分:4)

Task-based Asynchronous Pattern规定了适当的进展程序。如果您只对这个百分比感兴趣,那就是:

public async Task DownloadFIle(string url, string path, IProgress<int> progress = null)
{
  using (WebClient client = new WebClient())
  {
    client.DownloadProgressChanged += (s, e) =>
    {
      if (progress != null)
        progress.Report(e.ProgressPercentage);
    };

    await client.DownloadFileTaskAsync(url, path);
  }
}

使用代码可以使用内置的Progress<T>类来响应进度更新。适当的线程封送由Progress<T>类为您处理。

答案 1 :(得分:0)

“我不想将进度条与MP3Downloader类结合”

是的,那不会很酷。如何在View层上声明一个接口,然后通过一个实现调用控制器(注入依赖项,使用IoC容器),然后MP3Downloader类可以有一个线程继续发布有关进展的数据下载到GUI。这只是一个实现,如果你想重用GUI,你只会携带你的界面,即高度凝聚力和安全性。松耦合。