【问题标题】:Updating Progress Bar on GUI from a different object/class从不同的对象/类更新 GUI 上的进度条
【发布时间】:2014-05-28 21:48:42
【问题描述】:

我有一个管理从特定资源下载文件的类。该类在 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 类结合起来。

【问题讨论】:

  • 我相信你的问题的答案是肯定的,使用一个事件。如果要松耦合,请通过接口。这能回答你的问题还是我错过了什么?

标签: c#


【解决方案1】:

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&lt;T&gt;类来响应进度更新。正确的线程封送处理由 Progress&lt;T&gt; 类为您处理。

【讨论】:

  • 太棒了。在 xam 中实现
【解决方案2】:

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

是的,那不会很酷。如何在 View 层声明一个接口,然后通过实现(注入依赖,使用 IoC 容器)调用控制器,然后MP3Downloader 类可以有一个线程来持续发布有关进程的数据下载到图形用户界面。它只是一个实现,如果你想重用 GUI,你只会随身携带接口,即高内聚和松散耦合。

【讨论】:

  • 啊,小问题,因为我没有在这个项目上使用 MVC 模式。这是一个 Winforms 应用程序,我只是开发人员之一。
猜你喜欢
  • 2021-07-30
  • 1970-01-01
  • 1970-01-01
  • 2019-10-07
  • 1970-01-01
  • 2017-07-05
  • 2023-03-28
  • 1970-01-01
  • 2012-05-30
相关资源
最近更新 更多