我有一个管理从特定资源下载文件的类。该类在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
课程结合起来。
答案 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,你只会携带你的界面,即高度凝聚力和安全性。松耦合。