Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > WebClient


Автор: Felixx 22.8.2012, 19:24
Привет, как то странно работает веб клиент...
Первые 2 файла качает нормально..
когда начинает качать следущий как тока прошол коннект, сразу же для етого файла выполняется комплит..

Прога делает примерно следущее:
Скачиваем файл, как только скачали - распаковываем. Как только распаковали, удаляем архив. Впринципе самый обычный Updater файлов.

Вот логи проги:
1)
Код

======================
Начинаю качать файл: http://localhost:8080/update/xml_dir.7z в файл: D:\DONLOADS\games\pbupdate\xml_dir.7z
ProgressChanged для файла: D:\DONLOADS\games\pbupdate\xml_dir.7z
ProgressChanged для файла: D:\DONLOADS\games\pbupdate\xml_dir.7z
ProgressChanged для файла: D:\DONLOADS\games\pbupdate\xml_dir.7z
DownloadFileCompleted для файла: D:\DONLOADS\games\pbupdate\xml_dir.7z
goUnZip для файла: D:\DONLOADS\games\pbupdate\xml_dir.7z; path: D:\DONLOADS\games\pbupdate\xml_dir.7z
======================
Начинаю качать файл: http://localhost:8080/update/1.7z в файл: D:\DONLOADS\games\pbupdate\1.7z
ProgressChanged для файла: D:\DONLOADS\games\pbupdate\1.7z
ProgressChanged для файла: D:\DONLOADS\games\pbupdate\1.7z
ProgressChanged для файла: D:\DONLOADS\games\pbupdate\1.7z
DownloadFileCompleted для файла: D:\DONLOADS\games\pbupdate\1.7z
goUnZip для файла: D:\DONLOADS\games\pbupdate\1.7z; path: D:\DONLOADS\games\pbupdate\1.7z
======================
Начинаю качать файл: http://localhost:8080/update/2.7z в файл: D:\DONLOADS\games\pbupdate\2.7z
DownloadFileCompleted для файла: D:\DONLOADS\games\pbupdate\2.7z
goUnZip для файла: D:\DONLOADS\games\pbupdate\2.7z; path: D:\DONLOADS\games\pbupdate\2.7z
ProgressChanged для файла: D:\DONLOADS\games\pbupdate\2.7z
ProgressChanged для файла: D:\DONLOADS\games\pbupdate\2.7z
ProgressChanged для файла: D:\DONLOADS\games\pbupdate\2.7z
======================
Начинаю качать файл: http://localhost:8080/update/3.7z в файл: D:\DONLOADS\games\pbupdate\3.7z
ProgressChanged для файла: D:\DONLOADS\games\pbupdate\3.7z
ProgressChanged для файла: D:\DONLOADS\games\pbupdate\3.7z
ProgressChanged для файла: D:\DONLOADS\games\pbupdate\3.7z
DownloadFileCompleted для файла: D:\DONLOADS\games\pbupdate\3.7z
goUnZip для файла: D:\DONLOADS\games\pbupdate\3.7z; path: D:\DONLOADS\games\pbupdate\3.7z


2) Ещщоо хужее !!
Код

Начинаю качать файл: http://localhost:8080/update/xml_dir.7z в файл: D:\DONLOADS\games\pbupdate\xml_dir.7z
ProgressChanged для файла: D:\DONLOADS\games\pbupdate\xml_dir.7z
ProgressChanged для файла: D:\DONLOADS\games\pbupdate\xml_dir.7z
ProgressChanged для файла: D:\DONLOADS\games\pbupdate\xml_dir.7z
DownloadFileCompleted для файла: D:\DONLOADS\games\pbupdate\xml_dir.7z
goUnZip для файла: D:\DONLOADS\games\pbupdate\xml_dir.7z; path: D:\DONLOADS\games\pbupdate\xml_dir.7z
========================
Начинаю качать файл: http://localhost:8080/update/1.7z в файл: D:\DONLOADS\games\pbupdate\1.7z
ProgressChanged для файла: D:\DONLOADS\games\pbupdate\1.7z
ProgressChanged для файла: D:\DONLOADS\games\pbupdate\1.7z
ProgressChanged для файла: D:\DONLOADS\games\pbupdate\1.7z
DownloadFileCompleted для файла: D:\DONLOADS\games\pbupdate\1.7z
goUnZip для файла: D:\DONLOADS\games\pbupdate\1.7z; path: D:\DONLOADS\games\pbupdate\1.7z
========================
Начинаю качать файл: http://localhost:8080/update/2.7z в файл: D:\DONLOADS\games\pbupdate\2.7z
DownloadFileCompleted для файла: D:\DONLOADS\games\pbupdate\2.7z
goUnZip для файла: D:\DONLOADS\games\pbupdate\2.7z; path: D:\DONLOADS\games\pbupdate\2.7z
========================
Начинаю качать файл: http://localhost:8080/update/3.7z в файл: D:\DONLOADS\games\pbupdate\3.7z
ProgressChanged для файла: D:\DONLOADS\games\pbupdate\3.7z
ProgressChanged для файла: D:\DONLOADS\games\pbupdate\3.7z
ProgressChanged для файла: D:\DONLOADS\games\pbupdate\3.7z
DownloadFileCompleted для файла: D:\DONLOADS\games\pbupdate\3.7z
goUnZip для файла: D:\DONLOADS\games\pbupdate\3.7z; path: D:\DONLOADS\games\pbupdate\3.7z
========================
ProgressChanged для файла: D:\DONLOADS\games\pbupdate\3.7z
ProgressChanged для файла: D:\DONLOADS\games\pbupdate\3.7z
ProgressChanged для файла: D:\DONLOADS\games\pbupdate\3.7z
DownloadFileCompleted для файла: D:\DONLOADS\games\pbupdate\3.7z
goUnZip для файла: D:\DONLOADS\games\pbupdate\3.7z; path: D:\DONLOADS\games\pbupdate\3.7z
DownloadFileCompleted для файла: D:\DONLOADS\games\pbupdate\3.7z
goUnZip для файла: D:\DONLOADS\games\pbupdate\3.7z; path: D:\DONLOADS\games\pbupdate\3.7z
DownloadFileCompleted для файла: D:\DONLOADS\games\pbupdate\3.7z
goUnZip для файла: D:\DONLOADS\games\pbupdate\3.7z; path: D:\DONLOADS\games\pbupdate\3.7z
DownloadFileCompleted для файла: D:\DONLOADS\games\pbupdate\3.7z
goUnZip для файла: D:\DONLOADS\games\pbupdate\3.7z; path: D:\DONLOADS\games\pbupdate\3.7z
DownloadFileCompleted для файла: D:\DONLOADS\games\pbupdate\3.7z
goUnZip для файла: D:\DONLOADS\games\pbupdate\3.7z; path: D:\DONLOADS\games\pbupdate\3.7z



Код такой:
1) Вызываем скачивание
Код

            DManager.Instance.addToLoad(serv.updateurl + "/" + serv.updatefile, RConfig.Instance.PBDirectory + @"\" + serv.updatefile, serv.updatefile);
            for (int i = 1; i < 4; i++)
            {
                DManager.Instance.addToLoad(serv.updateurl + "/" + i + ".7z", RConfig.Instance.PBDirectory + @"\" + i + ".7z", i + ".7z");
            }


2) DManager
Код

using System;
using System.Collections.Generic;
using MMoNetworkUpdater.forms;
using System.Windows.Forms;
using System.Text;
using System.Runtime.CompilerServices;
using log4net;

namespace MMoNetworkUpdater
{
    class DManager
    {
        private static readonly ILog _log = LogManager.GetLogger(typeof(MainForm));
        private static DManager _instance;
        public static DManager Instance
        {
            get { return _instance ?? (_instance = new DManager()); }
        }

        private System.Net.WebClient webClient = new System.Net.WebClient();//Определяем

        [MethodImpl(MethodImplOptions.Synchronized)]
        public void load(Uri webFile, string fSystemFile, string fName)
        {
            MainForm.Instance.label2.Text = fSystemFile;
            //MessageBox.Show("START uri:" + webFile.AbsoluteUri + "; file: " + fSystemFile);
            try
            {
                _log.Info("Начинаю качать файл: " + webFile.AbsoluteUri + " в файл: " + fSystemFile);
                webClient.DownloadFileAsync(webFile, fSystemFile);//сохраняем фаил под именем
            }
            catch (NotSupportedException ex)
            {
                new MessageForm(ex);
            }
            //Следующей строчкой задаем заполнение и привязку к действию
            webClient.DownloadProgressChanged += new System.Net.DownloadProgressChangedEventHandler(webClient_DownloadProgressChanged);
            webClient.DownloadFileCompleted += new System.ComponentModel.AsyncCompletedEventHandler(webClient_DownloadFileCompleted);
        }

        void webClient_DownloadProgressChanged(object sender, System.Net.DownloadProgressChangedEventArgs e)
        {
            MainForm.Instance.label1.Text = String.Format("Загружено: {0} Кбайт / {1} Кбайт, {2} %", e.BytesReceived / 1024, e.TotalBytesToReceive / 1024, e.ProgressPercentage);//Выводим в лейбл информацию о процессе загрузки
            MainForm.Instance.progressOne.Value = e.ProgressPercentage;// заполняем
            //MainForm.Instance.label3.Text = String.Format("{0} %", e.BytesReceived);
            _log.Info("ProgressChanged для файла: " + MainForm.Instance.label2.Text);
        }

        void webClient_DownloadFileCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
        {
            //MessageBox.Show("unzip:" + MainForm.Instance.label2.Text);
            _log.Info("DownloadFileCompleted для файла: " + MainForm.Instance.label2.Text);
            MainForm.Instance.goUnZip(MainForm.Instance.label2.Text);
            MainForm.Instance.progressOne.Value = 0; //сброс progressBar
            //MainForm.Instance.label3.Text = ""; // сброс лейбл

            MainForm.Instance.label3.Text = String.Format("{0} %", _list == null ? 100 : 100 / _list.Count);
            MainForm.Instance.progressAll.Value = _list == null ? 0 : 100 / _list.Count;// заполняем

            if (_list != null && _list.Count > 0)
            {
                string[] array = _list[0];
                //MessageBox.Show("complited, next: " + array[2]);
                load(new Uri(array[0]),array[1],array[2]);
                _list.RemoveAt(0);

                if (_list.Count == 0)
                {
                    MainForm.Instance.BTN_PLAY.Enabled = true;
                    MainForm.Instance.BTN_UPDATE.Enabled = false;
                    MainForm.Instance.progressAll.Value = 0;
                    _list = null;
                }
            }
        }

        private List<string[]> _list;
        public void addToLoad(string s0,string s1, string s2)
        {
            if (_list == null)
            {
                _list = new List<string[]>();
                load(new Uri(s0), s1, s2);
            }
            else
            {
                _list.Add(new string[3] { s0, s1, s2 });
            }
        }
    }
}


Изза чего такое может происходить, что не так ? :(

Автор: Felixx 22.8.2012, 20:04
Если что то вот все:
http://rghost.ru/39940088

Автор: diadiavova 22.8.2012, 21:36
Felixx, просмотрел код поверхностно, насколько я понял, ты здесь в цикле запрашиваешь файлы асинхронно, то есть они качаются в несколько потоков. Здесь могут быть ограничения на максимальное количество потоков, как со стороны сервера, так и со стороны клиента. Ограничения со стороны клиента определяются в конфигурации приложения следующим образом
http://msdn.microsoft.com/ru-ru/library/fb6y0fyc.aspx
Попробуй увеличить максимальное количество подключений.

Автор: Felixx 22.8.2012, 22:16
Не, не помогает :(

Автор: diadiavova 22.8.2012, 22:21
Цитата(Felixx @  22.8.2012,  23:16 Найти цитируемый пост)
Не, не помогает :( 

А  что именно ты прописал?

Автор: Felixx 22.8.2012, 22:26
Код

<?xml version="1.0"?>
<configuration>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup>
<system.net>
    <connectionManagement>
      <add address = "*" maxconnection = "10" />
    </connectionManagement>
  </system.net>
</configuration>



Добавлено через 6 минут и 11 секунд
Чую, где то в логике программы косяк. Ибо начинаются глюки именно со 2го файла..
если 1 файл то все норм....
а пропотоки, разве это не решит проблему?

Код

 [MethodImpl(MethodImplOptions.Synchronized)]
        public void load(Uri webFile, string fSystemFile, string fName)
        {

Автор: diadiavova 22.8.2012, 22:32
Попробуй внести строку
Код

System.Net.WebClient webClient = new System.Net.WebClient();//Определяем
В код метода load. Возможно это ограничение самого вебклиента, ты ведь все закачки выполняешь с помощью одного экземпляра.

Автор: Felixx 22.8.2012, 22:40
Ох, и правда.. заработало! Странно, раньше я так делал ноне помогало..но я там уже много чего переделал..
Всеравно, огромное спасибо! 
Жаль что 100 постов ешо не набил, поставил бы + smile

Автор: diadiavova 22.8.2012, 22:46
Цитата(Felixx @  22.8.2012,  23:40 Найти цитируемый пост)
Странно, раньше я так делал ноне помогало..

Ну ты же в конфигурацию внес изменения. Не? smile 

Автор: Felixx 22.8.2012, 22:49
Дак я уже назад удалил))
Сделал просто так вот:

Код

        [MethodImpl(MethodImplOptions.Synchronized)]
        public void load(Uri webFile, string fSystemFile, string fName)
        {
            using (System.Net.WebClient webClient = new System.Net.WebClient()) //Определяем
            {
                MainForm.Instance.label2.Text = fSystemFile;
                //MessageBox.Show("START uri:" + webFile.AbsoluteUri + "; file: " + fSystemFile);
                try
                {
                    _log.Info("Начинаю качать файл: " + webFile.AbsoluteUri + " в файл: " + fSystemFile);
                    webClient.DownloadFileAsync(webFile, fSystemFile);//сохраняем фаил под именем
                }
                catch (NotSupportedException ex)
                {
                    new MessageForm(ex);
                }
                //Следующей строчкой задаем заполнение и привязку к действию
                webClient.DownloadProgressChanged += new System.Net.DownloadProgressChangedEventHandler(webClient_DownloadProgressChanged);
                webClient.DownloadFileCompleted += new System.ComponentModel.AsyncCompletedEventHandler(webClient_DownloadFileCompleted);
            }
        }

Автор: diadiavova 22.8.2012, 22:54
Цитата(Felixx @  22.8.2012,  23:49 Найти цитируемый пост)
Дак я уже назад удалил))

Ну я, честно говоря, не знаю сколько там коннекшнов дается по умолчанию smile Обычно если не хватает - можно добавить smile 

Автор: Felixx 22.8.2012, 23:02
Да я чото вообще ни понел в чем прикол того, что низя один и тот же клиент юзать несколько раз..
странная неведомая штука кака я то smile

Добавлено через 3 минуты и 39 секунд
Кстати, а не лучше ли запускать скачку в отдельном потоке через backgroundWorker ? Штоб форма и компоненты вдруг не подвисли нечайно?)

Автор: diadiavova 22.8.2012, 23:06
Цитата(Felixx @  23.8.2012,  00:02 Найти цитируемый пост)
Да я чото вообще ни понел в чем прикол того, что низя один и тот же клиент юзать несколько раз..
странная неведомая штука кака я то 

Дело не в том, что нельзя, просто ты не завершив загрузку одного файла, пытаешься загрузить другой с помощью этого же экземпляра вебклиента, а он в это время тупо занят. Если бы ты использовал синхронный метод загрузки, этой проблемы не возникло бы.

Автор: Felixx 22.8.2012, 23:12
А, ну ясно .. smile А что на счет отдельного потока для скачки?

Автор: diadiavova 22.8.2012, 23:17
Цитата(Felixx @  23.8.2012,  00:12 Найти цитируемый пост)
 А что на счет отдельного потока для скачки? 

А как она может подвиснуть случайно? Когда вызывается асинхронный метод, скачка и так происходит в отдельном потоке. Запускать бэкграундвокер только для выполнения кода, запускающего скачку, мне это кажется лишним.

Автор: Felixx 22.8.2012, 23:23
Ну я тоже так впринципе думал...
А не подскажеш, как лучше сделать, так, чтобы общий процент выполнения посчитать?
Например у меня файл (список файлов), в нем 2000 файлов. и каждый надо скачать..
тока по их количеству?
просто если например один файл 1 килобайт весит а второй 1гигобайт...
общий прогресс при скачивании первого станет 50% ... этож не правельно :(
Без добавления в список размера каждого файла, не обойтись никак? :(

Автор: diadiavova 22.8.2012, 23:36
Цитата(Felixx @  23.8.2012,  00:23 Найти цитируемый пост)
А не подскажеш, как лучше сделать, так, чтобы общий процент выполнения посчитать?

Так обработчик события DownloadProgressChanged дает ведь такую информацию. Посмотри свойства аргумента обработчика
http://msdn.microsoft.com/query/dev11.query?appId=Dev11IDEF1&l=RU-RU&k=k%28System.ComponentModel.ProgressChangedEventArgs.ProgressPercentage%29;k%28vs.objectbrowser%29;k%28TargetFrameworkMoniker-.NETFramework,Version%3Dv4.5%29;k%28TargetFrameworkMoniker-.NETFramework,Version%3Dv4.5%29&rd=true

Автор: Felixx 22.8.2012, 23:53
дак, это то я знаю.. но ведь это только текущий файл. а мне надо общее из 2 или 3000 файлов )) я про ето)

Автор: diadiavova 23.8.2012, 00:02
Цитата(Felixx @  23.8.2012,  00:53 Найти цитируемый пост)
дак, это то я знаю.. но ведь это только текущий файл. а мне надо общее из 2 или 3000 файлов )) я про ето) 

Значит надо организовать вычисления. Можно создать словарик, в котором ключом будет адрес файла, а значением процент скачки. Из обработчика обновляй данные в этом словаре. Когда надо вычислить общий прогресс, пройдись по словарю и вычисли среднее арифметическое прогресса. Или забивай туда инфу о прогрессе полностью и вычисляй по количеству скачанный байт и общему количеству. Это, конечно, только идея реализации, а не инструкция, просто направление куда копать.

Автор: Felixx 23.8.2012, 00:08
Угу, спасибо огромное ещо раз smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)