Событие DownloadFileCompleted не запускается внутри цикла loop c # .net - PullRequest
2 голосов
/ 15 февраля 2010

Я немного запутался, почему событие не запускается, когда файл загружен.

Файл, который он сам загружает совершенно нормально.

Я предполагаю, что в способе, которым я его использую, есть какая-то ошибка, поскольку событие не запускается внутри цикла.

Спасибо за любую помощь, кто может мне помочь

class DownloadQueue
{
    public List<string[]> DownloadItems { get; set; }
    public int CurrentDownloads;
    public int DownloadInProgress;
    string url = @"http://www.google.co.uk/intl/en_uk/images/logo.gif";
    bool downloadComplete;

    public DownloadQueue()
    {
        CurrentDownloads = 0;
        DownloadItems = new List<string[]>();
        Console.Write("new download queue made");
    }

    public void startDownloading(int maxSimulatiousDownloads)
    {
        downloadComplete = true;
        DownloadInProgress = 0;
        WebClient client = new WebClient();
        client.DownloadFileCompleted +=
                    new AsyncCompletedEventHandler(this.downloadCompleteMethod);


            while(DownloadInProgress != DownloadItems.Count )
            {
                if (downloadComplete == true)
                {
                    downloadComplete = false;          

                    client.DownloadFileAsync(new Uri(DownloadItems.ElementAt(DownloadInProgress).ElementAt(0).ToString()), DownloadItems.ElementAt(DownloadInProgress).ElementAt(1).ToString());                        
                }
            }
        Console.Write("all downloads completed");
    }

    private void downloadCompleteMethod(object sender, AsyncCompletedEventArgs e)
    {            
        downloadComplete = true;
        DownloadInProgress++;
        Console.Write("file Downloaded");
    }

    }

Ответы [ 2 ]

0 голосов
/ 16 февраля 2010

Скорее всего, нет времени для прихода сообщения. Я подозреваю, что если вы поместите Application.DoEvents в конце цикла, он начнет запускать события. Это менее чем идеально, чтобы использовать его, но с вашим дизайном я не могу придумать лучшего способа.

0 голосов
/ 16 февраля 2010

Где вы ждете завершения вызова DownloadFileAsync ()? Как насчет чего-то вроде

manualResetEvent AllDone = new mre(false)

как раз перед консолью .WriteLine

AllDone.WaitOne()

И в загрузке завершено

if (interlocked.decrement(ref downloadComplete) == 0) { AllDone.Set(); }
...