0

我从一个文件中获取几个文件链接到一个循环语句中,对于每个链接,我必须下载文件,下载完成后我必须对每个文件做一些事情。

这是我的代码,

      foreach(//condition ) {
            Descarcare = new WebClient();
                                Descarcare.DownloadProgressChanged += Descarcare_DownloadProgressChanged;
                                Descarcare.DownloadFileAsync(new Uri(nod.SelectSingleNode("DownloadLink").InnerText), Directory.GetCurrentDirectory()+);
                                Descarcare.DownloadFileCompleted +=Descarcare_DownloadFileCompleted;
}

    void Descarcare_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
    {
       //extract the file
    }

但不知何故,网络客户端下载文件,但 DownloadFileCompleted 事件仅针对最后下载的文件触发,而不是针对每个文件执行。

什么会导致这种情况?

4

1 回答 1

1

您在-loopWebClient的每次迭代中都创建了一个新的。foreach最好的方法是创建一个包含所有文件的队列,并在每个 DownloadFileCompleted 中开始新的下载,直到您获得所需的所有文件。

var _downloadQueue = new Queue<Uri>();
var _webClient = new WebClient();

//in your constructor:
_webClient.DownloadProgressChanged += Descarcare_DownloadProgressChanged;
_webClient.DownloadFileCompleted += Descarcare_DownloadFileCompleted;

private void Foo()
{
    //...

    foreach(/* condition */) 
    {
        _downloadQueue.Enqueue(
            new Uri(nod.SelectSingleNode("DownloadLink").InnerText)
        );                                    
    }

    DownloadNext();
}

private void DownloadNext()
{
    if(_downloadQeue.Count> 0)
    {
        _webClient.DownloadFileAsync(
            _downloadQueue.Dequeue(), Directory.GetCurrentDirectory()
        );
    }
}

void Descarcare_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
{
    DownloadNext();

    //extract the file
    //...
}
于 2013-11-02T09:59:46.687 回答