Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
1 / 1 / 1
Регистрация: 14.03.2012
Сообщений: 16

Как использовать WebClient для параллельной загрузки страниц

17.01.2015, 03:07. Показов 3185. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Время доброе.
Кто может подсказать, как использовать WebClient для параллельной загрузки страниц.
При данном способе время выполнения примерно 25 минут.
Если запустить одновременно 2 программы (в каждой закачивается только один сайт) то общее время выполнения 16 минут.
И, судя по загруженности канала во втором случаи, трафик потребляется в 2 раза больше, чем в первом (5 Мбит/с против 10 Мбит/с)

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
class MainDownloader
    {       
        private void StartMainDownloader()
        {
            Parallel.Invoke(
                () =>
                {
                    string webPath = "Path_1";
                    Downloader DL_1 = new Downloader(webPath);
                    DL_1.Start();
                },
                () =>
                {
                    string webPath = "Path_2";
                    Downloader DL_2 = new Downloader(webPath);
                    DL_2.Start();
                }
                );
        }
    }
    
class Downloader
    {   
        private string webPath;
        private List<string> MyList;
        
        void Downloader(string newPath)
        {
            webPath = newPath;
        }
        
        public void Start()
        {
            WebClient wClient = new WebClient();
            MyList = new List<string>;
            string page;
            for (int i=1; i<=1000; i++)
            {
                page = wClient.DownloadString("http://www."+webPath+".com/Page_nummer_"+i+".html");
                MyList.add(page);
            }
        }
    }
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.01.2015, 03:07
Ответы с готовыми решениями:

Как сделать класс для параллельной загрузки множества файлов из Интернет
Добрый день! Есть метод класса в который мы передаем перечень файлов допустим в списке List и нам необходимо ,чтобы данные файлы...

Асинхронный WebClient для параллельной закачки файлов со стартом нового после завершения одного из них
WebClient не поддерживает параллельные операции ввода-вывода. Вот такая ошибка вылезла и как я читал она потому что не завершилась другая...

Ссылки для скачивания с помощью WebClient.DownloadFile и WebClient.DownloadFileAsync
Ссылки какие должны быть, для скачивания webClient.DownloadFile и webClient.DownloadFileAsync Не пойму какие ссылки должны быть чтоб...

8
Фрилансер
735 / 352 / 96
Регистрация: 05.05.2014
Сообщений: 2,621
17.01.2015, 03:30
попробуй вот так

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
class MainDownloader
    {       
        private void StartMainDownloader()
        {
            string webPath = "Path_1";
            Downloader DL_1 = new Downloader(webPath);
            webPath = "Path_2";
            Downloader DL_2 = new Downloader(webPath);
            DL_1.Start();
            DL_2.Start();
        }
    }
    
class Downloader
    {   
        private string webPath;
        private List<string> MyList;
        
        void Downloader(string newPath)
        {
            webPath = newPath;
        }
        
        public async Task Start()
        {
            WebClient wClient = new WebClient();
            MyList = new List<string>;
            string page;
            await Task.Factory.StartNew(() =>
            {        
                for (int i=1; i<=1000; i++)
                {
                    page = wClient.DownloadString("http://www."+webPath+".com/Page_nummer_"+i+".html");
                    MyList.add(page);
                }
            }
        }
    }
2
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
17.01.2015, 03:40
Я бы как-нибудь так писал:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
 
namespace ConsoleApplication22
{
    class Program
    {
        static void Main(string[] args)
        {
            var downloader = new Downloader("http://bash.im/quote/");
            downloader.DownloadFinished += (sender, list) => Console.WriteLine(list.Count);
            downloader.Start(1, 10);
        }
    }
 
    class Downloader
    {
        public event EventHandler<IList<string>> DownloadFinished = delegate { };
        private readonly string[] _paths;
        readonly HttpClient _httpClient = new HttpClient() { MaxResponseContentBufferSize = 1000000 };
        public Downloader(string[] paths)
        {
            _paths = paths;
        }
 
        public Downloader(string path) : this(new[] {path})
        {
 
        }
 
        public void Start()
        {
            var result = _paths.AsParallel().Select(Download).ToList();
            DownloadFinished(this, result);
        }
 
        public void Start(int from, int to)
        {
            var list = new List<string>();
            foreach (var path in _paths)
            {
                var s = path;
                string[] results = new string[to - from + 1];
                for (int i = 0; i < results.Length; i++)
                {
                     results[i] = Download(s + (from + i));
                }
                list.AddRange(results);
            }
            DownloadFinished(this, list);
        }
 
        private string Download(string url)
        {
            var response = _httpClient.GetAsync(url).Result;
            return response.Content.ReadAsStringAsync().Result;
        }
    }
}
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
17.01.2015, 08:51
А я как-то так бы сделал.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
using System.Net;
 
namespace ConsoleApplication6 {
    class Program {
        static void Main(string[] args) {
            string[] urls ={"https://www.cyberforum.ru",
                            "http://www.goole.com",
                            "http://www.yandex.ru",
                            "http://mail.ru",
                            "http://www.rambler.ru"};
            var results = urls
                .AsParallel()
                .WithDegreeOfParallelism(urls.Length)
                .Select(url => new WebClient().DownloadString(url))
                .ToList();
 
            foreach (string s in results) {
                Console.WriteLine(s);
            }
            Console.ReadLine();
        }
    }
}
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
17.01.2015, 12:56
insite2012, по одному веб-клиенту на сайт. В случае 10к сайтов 10к клиентов, не гуд.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
17.01.2015, 13:55
Цитата Сообщение от Psilon Посмотреть сообщение
по одному веб-клиенту на сайт.
Psilon, а как иначе? Вопрос стоял именно про параллельную загрузку. В вашем случае, если я верно понял код, происходит последовательная, и по окончании всех загрузок срабатывает событие.
Так ведь?
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
17.01.2015, 16:43
insite2012, это можно изменить. Смысл в том, что у меня один HttpClient параллельно грузит столько, сколько нужно, в то время как webclient не поддерживает доступ из нескольких потоков
0
Фрилансер
735 / 352 / 96
Регистрация: 05.05.2014
Сообщений: 2,621
17.01.2015, 20:35
Psilon, можно вызвать webclient в другом потоке

C#
1
2
3
4
5
6
await Task.Factory.StartNew(() =>
{        
    using(WebClient wClient = new WebClient())
    {
    }
}
более абстрактно.
1
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
17.01.2015, 20:48
pro_100_gram, сколько потоков - столько вебклиентов и нужно. А HttpClient достаточно создать 1 на любое количество потоков. Примущество очевидно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.01.2015, 20:48
Помогаю со студенческими работами здесь

Отмена загрузки WebClient
используя DownloadFileAsync для скачивания все работает , но вот как отменить зарузку я не знаю уже пробывал CancelAsync ничего не...

Прогресс загрузки файла на сайт (WebClient)
Доброго всем времени суток! Имеется задача загружать файлы на сайт из c# приложения. С самой загрузкой в принципе никаких проблем...

Webclient.DownloadFileAcync ограничение скорости загрузки
Добрый день. Что-то я искал-искал и так и не нашел как реализовать.

Ошибка при загрузки файла webClient.UploadFile
Доброго времени суток, форумчане. Недавно начал изучать класс webclient и решил попробовать протестировать его. Столкнулся с ошибкой в 8...

Как оптимально сделать алгоритм параллельной загрузки и обработки веб-страниц
Всем привет! Моя программа сначала загружает исходный код ста html-страниц (использован цикл Parallel.For) - процессор почти не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru