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

Многопоточность с TPL и PLINQ

10.09.2017, 15:30. Показов 1584. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток!
В поисках ответов на свои вопросы, я удачно зашёл на данный форум и посетил тему, в которой увидел отличный код, скопирую его сюда, пожалуй:
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
62
63
64
65
66
67
68
69
70
71
72
using System;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace Postal
{
    public partial class Form1 : Form
    {
        private CancellationTokenSource mToken;
        private TaskScheduler mScheduler;
 
        public Form1()
        {
            InitializeComponent();
        }
 
        private async void buttonStart_Click(object sender, EventArgs e)
        {
            this.buttonStart.Enabled = false;
            this.buttonStop.Enabled = true;
            this.mToken = new CancellationTokenSource();
            this.mScheduler = TaskScheduler.FromCurrentSynchronizationContext();
 
            try
            {
                await Task.Factory.StartNew(o => this.Scan((CancellationToken)o),
                    this.mToken.Token,
                    this.mToken.Token,
                    TaskCreationOptions.LongRunning,
                    TaskScheduler.Default);
            }
            catch (OperationCanceledException)
            {
            }
            catch (AggregateException)
            {
            }
 
            this.buttonStart.Enabled = true;
            this.buttonStop.Enabled = false;
        }
 
        private void Scan(CancellationToken token)
        {
            string[] addresses = new string[] { "1", "2", "3", "4", "5", "6", "8", "9", "10" };
 
            addresses.AsParallel()
                .WithCancellation(token)
                .ForAll(x => this.Parse(token, x));
        }
 
        private void buttonStop_Click(object sender, EventArgs e)
        {
            this.mToken.Cancel();
        }
 
        private void Parse(CancellationToken token, string address)
        {
            this.ShowProgress(token, String.Format("{0} - {1}{2}", address, "start", Environment.NewLine));
            // Длительная операция
            token.WaitHandle.WaitOne(1000);
            this.ShowProgress(token, String.Format("{0} - {1}{2}", address, "end", Environment.NewLine));
        }
 
        private void ShowProgress(CancellationToken token, string message)
        {
            Task.Factory.StartNew(() => this.richTextBox1.AppendText(message), token, TaskCreationOptions.None, this.mScheduler);
        }
    }
}
Увидев его, мне сразу стало интересно, почему товарищ Rius дописывает "this."? Ведь без этого результат не поменяется. Или я не прав?
А теперь конкретный вопрос…
Если бы "Parse" выполнял запрос к сайту и обработку данных, а в "addresses" было бы 1000 ссылок, то получается "addresses.AsParallel()…" сделал бы сразу 1000 запросов, верно? Если это так, то как этого избежать? Лично я думаю, что, сделав небольшое ожидание перед запуском следующего запроса… Но целесообразно ли делать это в ручную. А может, как-то прописать, чтобы одновременно запускалось, например 10 выполнений и так далее, пачками по 10, но как.
Суть в том, что мне необходимо, допустим, получить данные из 1000 ссылок, вот я и думаю, как это лучше реализовать, используя TPL и PLINQ. Не хочется пользоваться Thread. Я много всего читал, пытался понять, но лишь данный пример оказался достаточно хорошим для моих целей.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.09.2017, 15:30
Ответы с готовыми решениями:

PLINQ и работа с PFX
Итак, приступим. Небольшое отступление. На создание этой темы меня подтолкнуло чтение статьи с сайта RSDN (написанной, в свою очередь, на...

NullReferenceException при использовании PLINQ
Добрый день, проблема заключается в том,что при парсинге сайта с помощью HtmlAgilityPack. Метод SelectNode может вернуть null( парсю 1000...

PLINQ или Parallel.ForEach?
Пытаюсь сообразить как лучше сделать задачку. Есть большой список EXCEL файлов и мне надо их считать проделать некоторые операции (все...

3
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
10.09.2017, 15:53
Цитата Сообщение от 90e3db19 Посмотреть сообщение
почему товарищ Rius дописывает "this."? Ведь без этого результат не поменяется.
В данном контексте-нет. Но иногда так делать нужно, чтобы различать имена параметров и локальных полей (если они совпадают).
Цитата Сообщение от 90e3db19 Посмотреть сообщение
получается "addresses.AsParallel()…" сделал бы сразу 1000 запросов
Да, параллельно запустится 1000 задач.
Цитата Сообщение от 90e3db19 Посмотреть сообщение
чтобы одновременно запускалось, например 10 выполнений и так далее, пачками по 10, но как.
Да, можно и так. Ключевой вопрос - нужно ли ждать до того, как выполнится вся группа запросов или просто подождать немного. Это, естественно, зависит от вашей задачи.
0
 Аватар для jahtemg
19 / 21 / 12
Регистрация: 24.06.2016
Сообщений: 71
10.09.2017, 15:53
1. Это просто стиль написания кода... Действительно, явное указание "this" вовсе не обязательно, но многие считают что это делает код более читабельным (в том числе и я)
2. Смотрите тут: https://stackoverflow.com/ques... asparallel ... в двух словах - это можно настроить
1
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
10.09.2017, 16:04
Цитата Сообщение от 90e3db19 Посмотреть сообщение
Увидев его, мне сразу стало интересно, почему товарищ Rius дописывает "this."? Ведь без этого результат не поменяется. Или я не прав?
Может ему так нравится? Если нет одноименных локальных переменных/параметров, то естественно не изменится...

Цитата Сообщение от 90e3db19 Посмотреть сообщение
Если бы "Parse" выполнял запрос к сайту и обработку данных, а в "addresses" было бы 1000 ссылок, то получается "addresses.AsParallel()…" сделал бы сразу 1000 запросов, верно?
Почему 1000? Должен одновременно запускать количество потоков, равное числу логических процессоров...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.09.2017, 16:04
Помогаю со студенческими работами здесь

Можно ли использовать PLINQ на .NET Framework 2.0
Добрый день! Возможно ли на c# проделать следующую штуку: если у пользователя стоит только .NET Framework 2.0, то запускать один...

Сумма и подсчет количества парных, непарных элементов в большом массиве (PLINQ)
Здавствуйте, нужна помощь в решении задачи. Дан большой массив радномных целых чисел (10000), нужно получить сумму всех елементов...

Найти среднее квадратическое отклонение от всех чисел последовательности с помощью PLINQ
Здравствуйте, нужна помощь в технологии plinq (именно с parallel), что бы распаралелитьлокальные данные. Суть задачи лежит в следующим:...

C# - TPL - Ошибка
Здравствуйте! Необходимо написать простейшую программу выполняющую изменение яркости изображения с использованием технологии параллельных...

Последовательность задач TPL
Помогите разобраться с связыванием задач. Почему при пошаговом выполнении программы, id задач идут последовательно, а при обычном запуске...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
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-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru