Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.11.2014, 18:28   #11
L6go1as
Форумчанин
 
Регистрация: 20.10.2011
Сообщений: 433
По умолчанию

А как в случае с WebClient: WebClient wb = (WebClient) sender;
Событие поймет, что скажем данные нужно к нужному бару подвести ?

Мне кажется, или тут progressBars[ind].Value = e.ProgressPercentage; все бары будут равны друг другу ?
L6go1as вне форума Ответить с цитированием
Старый 02.11.2014, 18:32   #12
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Причем тут эта строка? Когда вебклиент генерирует событие он передает туда ссылку на себя (object sender), вот по нему и ищется вебклиент в списке вебклиентов (точнее его индекс).

webClients это список вебклиентов (List и т.п.).
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 02.11.2014, 19:37   #13
L6go1as
Форумчанин
 
Регистрация: 20.10.2011
Сообщений: 433
По умолчанию

Проверял работоспособность на малом кол-ве файлов, на 2х если быть точным.
Сейчас загрузил лист из 10 файлов, оказывается что Async сразу за все берется.
Можно ли поставить ожидаение ?

Мол полка не скачал файлы в первом цикле, на второй не переходить ?
L6go1as вне форума Ответить с цитированием
Старый 02.11.2014, 19:42   #14
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

эм... что? в каком цикле?
Надо по очереди файлы грузить что ли? Ну создайте 1 вебклиент вместо 10 и начинайте след. загрузку в DownloadFileCompleted.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 02.11.2014, 19:51   #15
L6go1as
Форумчанин
 
Регистрация: 20.10.2011
Сообщений: 433
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
эм... что? в каком цикле?
Надо по очереди файлы грузить что ли? Ну создайте 1 вебклиент вместо 10 и начинайте след. загрузку в DownloadFileCompleted.
у меня получается так:

Код:
for (int i = 0; i < 100; i++) // кол-во файлов txt а которых содержатся ссылки на файлы под загрузку
{
for (int j = 0; j < 10; j++) // загрузка 10ть файлов сразу по средствам Async
{
}
}
Но при запуске, получается что идет загрузка сразу всех 100*10 файлов.

Вот как поставить в второй цикле, что бы Async ждал загрузки 10 файлов, и лишь потом приступал к следующей интерации ?
L6go1as вне форума Ответить с цитированием
Старый 02.11.2014, 20:13   #16
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Так нельзя ждать в цикле при асинхронных методах. Тогда бы они блокировали поток и не были асинхронными. Разве что с async/await что-то похожее можно.

Надо грузить 10 файлов параллельно, потом снова запустить 10 параллельно и т.д.?
Или надо, чтобы параллельно грузилось не более 10 файлов? (то есть поставил 10 файлов, один из них уже загрузился, одновременно грузящихся файлов соответственно стало 9 — значит пора добавить еще один).
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 02.11.2014, 20:18   #17
L6go1as
Форумчанин
 
Регистрация: 20.10.2011
Сообщений: 433
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Так нельзя ждать в цикле при асинхронных методах. Тогда бы они блокировали поток и не были асинхронными. Разве что с async/await что-то похожее можно.

Надо грузить 10 файлов параллельно, потом снова запустить 10 параллельно и т.д.?
Или надо, чтобы параллельно грузилось не более 10 файлов? (то есть поставил 10 файлов, один из них уже загрузился, одновременно грузящихся файлов соответственно стало 9 — значит пора добавить еще один).
Идеальный конечно же последний вариант.
Но я если честно уже четвертый день бьюсь, уже выдыхаюсь ....
Если подскажите чего буду благодарен как никто другой )
L6go1as вне форума Ответить с цитированием
Старый 02.11.2014, 20:51   #18
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Код:
        public Form1()
        {
            InitializeComponent();

            for (int i = 0; i < 5; i++) // просто генерация файлов и их списка
            {
                string fname = "file" + i + ".txt";
                File.WriteAllLines(fname, Enumerable.Repeat("http://programmersforum.ru", 10));
                urlFiles.Add(fname);
            }

            for (int i = 0; i < 10; i++) // просто создание списка прогресбаров
            {
                progressBars.Add(new ProgressBar()
                {
                    Parent = this,
                    Left = 1,
                    Top = 100 + 30 * i,
                    Height = 25,
                    Width = 250,
                    Maximum = 100
                });
            }
        }

        private List<string> urlFiles = new List<string>();

        private Queue<string> urlQueue = new Queue<string>();
        private Queue<string> outputFilenameQueue = new Queue<string>();
        
        private List<ProgressBar> progressBars = new List<ProgressBar>();

        private void button1_Click(object sender, EventArgs e)
        {
            // чтение всех ссылок из всех файлов + имен выходных файлов
            urlQueue.Clear();
            outputFilenameQueue.Clear();
            int c = 0;
            foreach (var urlFile in urlFiles)
            {
                var urls = File.ReadAllLines(urlFile).Where(s => !String.IsNullOrWhiteSpace(s));
                foreach (var url in urls)
                {
                    urlQueue.Enqueue(url);          
                    outputFilenameQueue.Enqueue(c++ + ".html");
                }
            }

            for (int i = 0; i < 10; i++)
            {
                var wb = new WebClient();
                
                var pb = progressBars[i];
                wb.DownloadProgressChanged += (o, args) =>
                {
                    pb.Value = args.ProgressPercentage;
                };

                wb.DownloadFileCompleted += WbDownloadFileCompleted;

                wb.DownloadFileAsync(new Uri(urlQueue.Dequeue()), outputFilenameQueue.Dequeue());
            }
        }

        private void WbDownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
        {
            var wb = (WebClient) sender;

            if (urlQueue.Count > 0)
            {
                wb.DownloadFileAsync(new Uri(urlQueue.Dequeue()), outputFilenameQueue.Dequeue());
            }
        }
А первое тоже не сложно, не знаю чего тут 4 дня биться Просто создать счетчик (int), при запуске ++, при Completed -- и там же проверять когда 0 — загрузить 10 ссылок из следующего файла и запустить их.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 02.11.2014 в 21:08.
Alex11223 вне форума Ответить с цитированием
Старый 02.11.2014, 21:21   #19
L6go1as
Форумчанин
 
Регистрация: 20.10.2011
Сообщений: 433
По умолчанию

Alex11223, я уж и не знаю как благодарить тебя )) тут одним "спасибо" уже не отделаешься ))

На самом деле я думал о чем-то подобном, в плане счетчика, но не знал как реализовать. Я с событиями еще не дружу, поэтому в них предпочитаю ничего лишнего не писать, мол работает как есть и ладно.
L6go1as вне форума Ответить с цитированием
Старый 08.11.2014, 13:51   #20
L6go1as
Форумчанин
 
Регистрация: 20.10.2011
Сообщений: 433
По умолчанию

Появилась ошибка, которую пока не получается решить (так как не понимаю что собственно происходит).

Программа, работает, но, работает только при включенном Fiddler'e и с активной вкладкой в нем Stream.

Если отключить Fiddler - все, корректно программа перестает работать.
Если отключить Stream, но отставить Fiddler включенным - пропадает отображение процесса (которое появляется только при 100% загрузке файла).

В чем прикол ? Что за фигня ? )
L6go1as вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Процедуры и функции как метод класса, или... Pcrepair Общие вопросы Delphi 4 03.09.2013 21:32
Интернет магазины или как не дать себя развести whatever Свободное общение 13 17.04.2013 00:15
MS SQL Server: универсальный Logger сделанный как триггер Glen SQL, базы данных 8 11.03.2013 13:59
Как объявлять (или описывать) метод locate? Andr_zdes Помощь студентам 6 21.05.2009 14:22
Как создать универсальный шаблон документа? CoolMan Microsoft Office Word 1 18.12.2007 09:10