使用一个进度条(可取消)异步下载多个文件

时间:2019-01-12 23:26:49

标签: c# multithreading async-await progress-bar

从标题中可以看到,我需要异步下载多个文件,并带有一个进度条,该进度条说明了整个下载的进度,并为整个下载操作提供了一个取消选项按钮。我需要在C#中实现的所有这些。

我是C#的初学者,据我从其他答案中了解到,以及大约3个小时的Googleing时,我需要为取消选项创建一个后台线程,并且我需要有多个WebClient(因为它们不支持多线程)才能下载每个文件。我编写了可以异步下载文件的版本,但是在这种情况下,我不知道如何提供取消按钮以及有关总体上传的信息(因为线程异步运行)。总的来说,我无法弄清楚如何混合使用,因为我看到它必须具有后台线程,并且后台线程的doWork函数中必须有多个WebClients线程,但是即使在这种情况下,如果单击“取消”按钮,它也只会停止后台线程而不是其他下载文件的线程(也许我需要将该线程创建为后台线程子线程,并且该问题将得到解决?)。 这是异步下载的主要部分(为简单起见,我将跳过其他功能的实现)。而且我在这里也有一个问题,用这种方式它可以创建38个线程(这是我正在下载的文件数),但是我有2个具有超线程的内核,所以有4个逻辑内核,如何防止程序创建超过4个线程,给出一个条件,以便在首先免费的线程中运行下一次下载。

private void startBtn_Click(object sender, EventArgs e)
{
    foreach (String url in urls)
    {
        WebClient client = new WebClient();
        client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(client_DownloadProgressChanged);
        client.DownloadFileCompleted += new AsyncCompletedEventHandler(client_DownloadFileCompleted);
        String filename = url.Substring(url.LastIndexOf('/'));
        string downloadToDirectory = directory + filename;
        client.DownloadFileAsync(new Uri(url), downloadToDirectory);
    }
} 

0 个答案:

没有答案