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
    }

しかし、どういうわけか、webclient はファイルをダウンロードしますが、DownloadFileCompleted イベントは、ファイルごとではなく、最後にダウンロードされたファイルに対してのみ発生します。

何が原因でしょうか?

4

1 に答える 1

1

WebClient-loopの繰り返しごとに新しいものを作成しています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 に答える