C# 从其他对象/类更新GUI上的进度条
我有一个类管理从特定资源下载文件。该类在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,
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中实现