C# 从其他对象/类更新GUI上的进度条

C# 从其他对象/类更新GUI上的进度条,c#,C#,我有一个类管理从特定资源下载文件。该类在GUI线程中实例化。例如,该类被称为MP3Download 在MP3Downloader中,我有一个名为DownloadFile的方法: public async Task DownloadFIle(string url, string path) { using (WebClient client = new WebClient()) { client.DownloadProgressChanged += (s,

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

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

是的,那可不酷。在视图层上声明一个接口,然后通过一个实现(注入依赖项,使用IoC容器)调用控制器,怎么样?
MP3Downloader
类可以有一个线程,该线程将不断向GUI发布有关下载进度的数据。这只是一个实现,如果您想重用GUI,您将只携带接口,即高内聚性和松散耦合。

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

是的,那可不酷。在视图层上声明一个接口,然后通过一个实现(注入依赖项,使用IoC容器)调用控制器,怎么样?
MP3Downloader
类可以有一个线程,该线程将不断向GUI发布有关下载进度的数据。这只是一个实现,如果您想重用GUI,您将只携带接口,即高内聚性和松散耦合。

规定了适当的进度过程。如果您只是对百分比感兴趣,那么:

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);
  }
}
公共异步任务下载文件(字符串url、字符串路径、IProgress progress=null)
{
使用(WebClient=newWebClient())
{
client.DownloadProgressChanged+=(s,e)=>
{
如果(进度!=null)
进度报告(如进度百分比);
};
等待client.DownloadFileTaskAsync(url,路径);
}
}
使用代码可以使用内置的
Progress
类来响应进度更新。正确的线程封送由
进度
类为您处理。

规定了正确的进度过程。如果您只是对百分比感兴趣,那么:

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);
  }
}
公共异步任务下载文件(字符串url、字符串路径、IProgress progress=null)
{
使用(WebClient=newWebClient())
{
client.DownloadProgressChanged+=(s,e)=>
{
如果(进度!=null)
进度报告(如进度百分比);
};
等待client.DownloadFileTaskAsync(url,路径);
}
}

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

啊,有点小问题,因为我在这个项目上没有使用MVC模式。这是一个Winforms应用程序,我只是其中一个开发者。啊,有点小问题,因为我在这个项目上没有使用MVC模式。这是一个Winforms应用程序,我只是其中一个开发者。我相信你的问题的答案是肯定的,使用事件。如果需要松耦合,请通过接口。这是回答你的问题还是我遗漏了什么?我相信你问题的答案是肯定的,用一个事件。如果需要松耦合,请通过接口。这能回答你的问题吗?还是我遗漏了什么?太棒了。在xamawesome中实现。在xam中实现