Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.64/25: Рейтинг темы: голосов - 25, средняя оценка - 4.64
0 / 0 / 1
Регистрация: 13.11.2016
Сообщений: 20
.NET 4.x

Потоки, мультипоточность Task or Async/Await or ThreadPool?

16.11.2016, 13:59. Показов 5135. Ответов 30
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте форумчане. Я очень нуждаюсь в вашей помощи.

Я реализовываю парсер с одного довольно популярного сайта занятости и трудоспособности.
В общем программа собирает информацию имя, фамилия и т.д.
Работает она в 100-200 потоках с использованием проксей.

В потоках парсится информация и выводится в GUI, а это:
1)Статистика успешных подключений и сбора информации, которая отображается в label
2)Вывод информации в richtextbox.
3)увеличение progressbar.
4)Сохранение информации в файл.

Использовал Thread но с ним задача перерастает в АД. Гемморой с выводом, чтобы ГУИ не тормозил + сохранение из несколько потоков в файл нереален.
Мой вопрос: какой вид потоков мне использовать для задачи.

Алгоритм примерно таков:
Создаются потоки(штук 100)
Каждый Поток идет в метод подключения к сайту , распаршивает полученный html, вытаскивает нужные значения и передает их в ГУИ.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.11.2016, 13:59
Ответы с готовыми решениями:

Task и async-await
Объясните пожалуйста, в чем преимущество async-await? И в чем разница между обычной задачей? Ведь задачи то же выполняются независимо друг...

Многопоточность с async/await и Task
Помогите разобраться с многопоточностью, совсем запутался после чтения множества статей. Нужно использовать async/await или таски. ...

Async/ await как правильно ввести данные в async метод (консоль)
Привет , кто то может помочь ?) проблема в тому что у меня есть async метод который запускается из Main, по среди этого метода...

30
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
17.11.2016, 10:52
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Ferxs Посмотреть сообщение
Я как понимаю Task офигенная штука
Тут я согласен. Еще более высокий уровень абстракции это методы класса Parallel и использование PLINQ.

insite2012, понятно что для разных задач - разные методы решения. Если ограничения вида "поддержка WinXP" не оговорены явно, наверное не стоит их рассматривать. Тут, по-моему, спорить не о чем. А вот про реализацию своего BGW хотелось бы по-подробнее, если можно.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
17.11.2016, 10:58
Цитата Сообщение от TopLayer Посмотреть сообщение
ограничения вида "поддержка WinXP" не оговорены явно
Такие ограничения ставит сама жизнь (если пишешь ПО не по заказу для конторы, а с расчетом на как можно более широкий круг пользователей). Какую ОС пользователь предпочитает - угадать нельзя, так что чем шире охват систем, на которых работает ПО, тем больше звонких монет в кармане. Разве я не прав?
Цитата Сообщение от TopLayer Посмотреть сообщение
вот про реализацию своего BGW хотелось бы по-подробнее, если можно.
Идея проста, метод OnDoWork() у BGW виртуальный, а сам он не запечатанный и этот метод можно переопределить.
Тут самый простенький пример.
1
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
17.11.2016, 11:16
Цитата Сообщение от insite2012 Посмотреть сообщение
проброс исключений в вызывающий поток без их явного отлова и передачи
я думал тут что-то интересное, а тут проcто крах программы в случае чего .
Похожий велосипед и у меня нашелся:
Кликните здесь для просмотра всего текста
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
    internal class ControlAutoUpdater: IDisposable
    {
        private readonly Action _action;
        private readonly Func<bool> _isOutdated;
        private readonly Timer _timer;
        private bool _disposed;
 
        public ControlAutoUpdater(Action action, Func<bool> isOutdated, int interval)
        {
            if (action == null) throw new ArgumentNullException(nameof(action));
            if (isOutdated == null) throw new ArgumentNullException(nameof(isOutdated));
            if (interval <= 0) throw new ArgumentOutOfRangeException(nameof(interval));
 
            _action = action;
            _isOutdated = isOutdated;
            _timer = new Timer {Interval = interval};
            _timer.Tick += (s, a) => RunOneIteration();
            _timer.Enabled = true;
        }
 
        private void RunOneIteration()
        {
            if (_isOutdated())
                _action();
        }
 
        public void Dispose()
        {
            if (_disposed) return;
            _timer.Dispose();
            _disposed = true;
        }
    }
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
17.11.2016, 11:32
Цитата Сообщение от TopLayer Посмотреть сообщение
тут проcто крах программы в случае чего
С чего бы это? В переопределенном методе OnDoWork() можно запросто вызывать любое исключение через throw(), и ничего не упадет. А в обработчике RunWorkerCompleted проверяем свойство Error, и если оно не null, это и есть наше исключение. Разве вы не видите удобства? Странно...
0
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
17.11.2016, 11:37
insite2012, ааа, теперь понял

Добавлено через 46 секунд
или нет...
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
17.11.2016, 11:41
Цитата Сообщение от TopLayer Посмотреть сообщение
теперь понял
или нет...
Да вроде простая идея. В методе OnDoWork() мы делаем свою работу, можем бросать исключения (или что-то еще, что мы оттуда вызываем может его выбросить, не суть). Если оно возникнет - выполнение данного метода (но не всего приложения) прервется, а во внешнем коде отработает обработчик RunWorkerCompleted(), из свойства Error аргумента этого обработчика мы и получаем наше исключение.
0
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
17.11.2016, 11:41
Основной метод, который делает работу, подписан на событие ProgressChanged. Он будет выполнятся в потоке GUI. И при возникновении исключения в нём программа крашнется. Разве нет? Сейчас проверю.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
17.11.2016, 11:45
TopLayer, как-то странно у вас организовано... Этот метод об уведомлениях о прогрессе длительной операции, зачем в нем делать какую-то основную работу...

Добавлено через 1 минуту
Цитата Сообщение от TopLayer Посмотреть сообщение
при возникновении исключения в нём программа крашнется
Этот метод работает в потоке GUI, и естественно, что к самому BGW имеет опосредованное отношение. Так что обработка исключений в нем - забота внешнего кода, но никак не самого BGW.
0
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
17.11.2016, 12:57
insite2012, единственное, что мне не нравится это ReportProgress. BeginInvoke более гибок. Вот такой сценарий естественным образом не укладывается в ReportProgress:
C#
1
2
3
4
5
6
7
8
9
10
int work = GetWork();
work = SimplifyWork();
string message = (work > 1000) ? "Wait several hours" : "Wait several minutes";
BeginInvoke(new Action(() => { textBox1.AppendText(message); }));
for (int i = 0; i < work; ++i)
{
    DoWork(i);
    int j = i;
    BeginInvoke(new Action(() => { textBox2.Text = j + "/" + work; }));
}
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
17.11.2016, 13:50
Цитата Сообщение от TopLayer Посмотреть сообщение
единственное, что мне не нравится это ReportProgress. BeginInvoke более гибок
TopLayer, вы путаете одно с другим. ReportProgress() - это одно, а Invoke()/BeginInvoke() - другое. И сферы применения разные.
1
0 / 0 / 1
Регистрация: 13.11.2016
Сообщений: 20
17.11.2016, 14:12  [ТС]
Что универсальней и лучше/качественней? Parallel или Task?

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

А к чему стремиться то?

Кликните здесь для просмотра всего текста
P.s наверное никто не ответит на данный вопрос, придется самому перелопатить все методы создания потоков и прийти к мнению. Сложней, но качественней.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.11.2016, 14:12

Async/Await и Task
В чем разница между Async/Await и Task? и то и другое создает задачу, где и как лучше что использовать?

Перевести выполнение в потоки (с помощью async/await)
есть код: private void button1_Click(object sender, EventArgs e) { string sqlbase; ...

Async, await
Объясните работу async, await. Облазил весь интернет, но ничего толкового не нашел. Заранее спасибо))

Async/await
Мне нужно, чтобы пароль выводился по одному символу public Matrix() { InitializeComponent(); ...

async/await (._. )
Опять я с глупым вопросом. Не могу понять, почему метод, который выгружает данные не асинхронный? Вообще форма зависает на неопределенное...


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

Или воспользуйтесь поиском по форуму:
31
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru