WebClient.DownloadFileAsync не сообщает DownloadProgressChangedEventArgs до тех пор, пока не будет запущен AsyncCompletedEventHandler - PullRequest
1 голос
/ 30 декабря 2011

У меня проблема с WebClient, когда WebClient.DownloadFileAsync не сообщает DownloadProgressChangedEventArgs до тех пор, пока не будет запущен AsyncCompletedEventHandler.

У меня есть метод downloadFileAsync, реализованный в классе с именем HTTP в dll с именем Test.dll.,Это в основном сводится к запуску WebClient.DownloadFileAsync (новый Uri (URL), downloadLocation);

Вот тестовый код, который я использую, чтобы обернуть его.

Program.cs просто делает это:

namespace DL1
{
    class Program
    {
        static void Main(string[] args)
        {
            FLFront start = new FLFront();
        }
    }
}

FLFront.cs таков:

using System;
using System.ComponentModel;
using System.IO;
using System.Net;
using System.Text;
using System.Threading;
using System.Timers;
using Test;

namespace DL1
{
    class FLFront
    {
        static HTTP dlMGR;
        static Boolean downloadingCurrently = false;
        static System.Timers.Timer canDLChecker = new System.Timers.Timer();
        public FLFront()
        {
            SpecialWebClient swc = new SpecialWebClient();
            swc.setAmazonArt();
            dlMGR = new HTTP(swc);
                dlMGR.downloadJobs.Enqueue(@"http://downloads.sourceforge.net/project/sevenzip/7-Zip/9.20/7z920-x64.msi?r=http%3A%2F%2Fwww.7-zip.org%2Fdownload.html&ts=1325195085&use_mirror=superb-dca2");
                //dlMGR.downloadJobs.Enqueue(@"http://www.ubuntu.com/start-download?distro=desktop&bits=64&release=latest");
                dlMGR.downloadJobs.Enqueue(@"http://ftp.heanet.ie/mirrors/damnsmalllinux.org/current/dsl-4.4.10-initrd.iso");

                dlMGR.swc.DownloadFileCompleted += new AsyncCompletedEventHandler(dlCompleted);
                dlMGR.swc.DownloadProgressChanged += new DownloadProgressChangedEventHandler(dlProgress);


                canDLChecker.Elapsed += new ElapsedEventHandler(downloadFile);
                canDLChecker.Interval = 500;
                canDLChecker.Enabled = true;

                Thread.Sleep(3000000);
            }

            void dlCompleted(object sender, AsyncCompletedEventArgs e)
            {
                downloadingCurrently = false;
                if (File.Exists(dlMGR.downloadLocation))
                {
                    FileInfo dlInfo = new FileInfo(dlMGR.downloadLocation);
                    Console.WriteLine("Received Size: " + dlInfo.Length.ToString() + " Bytes");
                    if (dlInfo.Length == dlMGR.responseContentLength)
                    {
                        //downloadLocation.ren
                        //Console.WriteLine("Error: This file was not downloaded for some reason");
                        Console.WriteLine("File successfully downloaded.");
                        File.Move(dlMGR.downloadLocation, dlMGR.downloadLocation.Replace(".part", ""));
                    }
                    else
                    {
                        Console.WriteLine("File size mismatch.");
                    }
                }
                else
                    Console.WriteLine("File doesn't exist");
            }

            void dlProgress(object sender, DownloadProgressChangedEventArgs e)
            {
                //Console.WriteLine(e.BytesReceived);
                Console.WriteLine(e.ProgressPercentage + "%  ");
            }

            void downloadFile()
            {
                if (!downloadingCurrently)
                {
                    if (dlMGR.downloadJobs.Count > 0)
                    {

                        downloadingCurrently = true;
                        Console.WriteLine("Download starting: " + dlMGR.downloadJobs.Peek());
                        StringBuilder dlResult = dlMGR.downloadFileAsync(dlMGR.downloadJobs.Dequeue(), @"C:\", LoggingLevel.ErrorsOnly);
                        Console.Write(dlResult.ToString());
                        if (dlResult.ToString().Contains("Error: "))
                            dlFailed();
                    }
                    else
                    {
                        Console.WriteLine("No more download jobs exist. Exiting now.");
                        Environment.Exit(0);
                    }
                }
            }

            void downloadFile(object source, ElapsedEventArgs e)
            {
                downloadFile();
                //Console.WriteLine("Check Occurred");
            }

            void dlFailed()
            {
                downloadingCurrently = false;
                Console.WriteLine("Download Failed.");
            }
        }
    }

У меня сейчас есть только несколько тестовых файлов, но код не сообщает о каком-либо прогрессе, пока файлы в основномзагрузка завершена

Мысли о том, почему не сообщается о прогрессе?

1 Ответ

0 голосов
/ 30 декабря 2011

Выполните назначения событий, прежде чем ставить в очередь файлы для загрузки.Кроме того, удалите строку Thread.Sleep, это остановит ваш текущий поток, и ваши обработчики не попадут, потому что они созданы в одном потоке.

...