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

Распараллеливание обработки массива

08.02.2016, 19:20. Показов 2069. Ответов 3

Студворк — интернет-сервис помощи студентам
Привел код для примера (реальный посерьезней).
Надо обрабатывать массив в несколько потоков и иметь возможность в любой момент эту обработку прервать.

C#
1
2
3
4
5
6
7
event EventHandler Loaded;
 
public void LoadImages(DirectoryInfo source)
{
    foreach (var file in source.GetFiles())
            Loaded?.Invoke( new Icon(file) );
}
Пытался сделать через Parallel и PLINQ.
Столкнулся с проблемой полного зависания обработки на определенном элементе (без генерации события работает).

C#
1
2
3
4
5
6
event EventHandler Loaded;
 
public void LoadImages(DirectoryInfo source)
{
        Parallel.ForEach(source.GetFiles(), (arg) => Loaded?.Invoke( new Icon(arg) ));
}
Также делал через ThreadPool - работает. Но возможности отмены нет.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.02.2016, 19:20
Ответы с готовыми решениями:

Распараллеливание обработки List<T>
Доброго времени суток. Столкнулся с такой проблемой... Имеется List&lt;string&gt;, обрабатывал его с помощью Parallel.ForEach, вот так: ...

Осуществить распараллеливание алгоритма, реализующего нахождение минимального элемента одномерного массива
Help help help есть задание &quot;Нахождение вектора минимальных элементов строк матрицы.&quot; и вот код using System; using...

Функции обработки массива (определить произведение элементов массива, заменить модулем все элементы массива, уничтожить элемент с заданным значением)
Вот задания,не могу сделать ни одного из них,буду благодарен за помощь. Написать функции для выполнения операций над одномерным...

3
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
08.02.2016, 19:28
Лучший ответ Сообщение было отмечено tryff как решение

Решение

Замените Invoke на BeginInvoke.
1
0 / 0 / 1
Регистрация: 19.12.2015
Сообщений: 21
08.02.2016, 21:46  [ТС]
Хорошо бы понять почему с Invoke зависает, а с BeginInvoke нет
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
08.02.2016, 22:47
Цитата Сообщение от tryff Посмотреть сообщение
Хорошо бы понять почему с Invoke зависает, а с BeginInvoke нет
Вызов Parallel.ForEach замораживает поток до тех пор, пока весь цикл не выполнится.
Этот метод вы вызываете, скорее всего, в основном потоке.
Метод Invoke выполняет передаваемый ему делегат в основном потоке и замораживает текущий до тех пор, пока этот делегат не отработает.
Получается классический deadlock: основной поток ждет завершения работы Parallel.ForEach, а Invoke внутри ForEach ждет возможности выполнить код в основном потоке.

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

По факту у вас сначала отработает весь цикл, а после его окончания попрут толпой вызовы из очереди. Что, кстати, подвесит основной поток на некоторое время.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.02.2016, 22:47
Помогаю со студенческими работами здесь

Алгоритм обработки массива
Дана задача переместить все отрицательные элементы в конец при этом сохраняя их последовательность вот код using System; using...

Программа обработки массива
с помощью указателей. Ввести с клавиатуры одномерный массив из 5 чисел , подсчитать сумму элементов массива.

Функции обработки массива
Помогите найти в коде ошибку!) #include &lt;iostream&gt; #include &lt;cstdlib&gt; #include &lt;ctime&gt; using namespace std; int Kolvo (int...

Написать программу обработки массива
Визуализировать данные, заданные в виде массива. Числовые данные, которые ниже указанных пользователем пороговых значений, выделить. Стиль...

Программа обработки массива структр
Написать программу обработки массива структр, содержащую следующие пункты меню: - Создание, - Просмотр, - Коррекция – добавление...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru