0 / 0 / 0
Регистрация: 02.07.2017
Сообщений: 1
.NET 4.x

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

10.09.2017, 15:30. Показов 1581. Ответов 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru