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

Переделка программы для использования многопоточности

16.06.2021, 12:17. Показов 1439. Ответов 8

Студворк — интернет-сервис помощи студентам
Здравствуйте.

Имеется программа Windows service, написанная на C#, которая периодически получает набор данных у стороннего web-cервиса, обрабатывает их и записывает в базу данных.
Изначально не подразумевалась последовательная загрузка массивов данных. Сначала грузится один набор, потом следующий и т.д.
Но со временем объём загружаемых данных и кол-во наборов увеличилось и возникла необходимость загружать их в параллельном режиме. Загрузка одного набора данных стала занимать более часа.
Если говорить вкратце, то требуется запуск метода одного и того же класса с различными параметрами в многопоточном режиме.
Каждый поток должен запускаться в изолированном режиме и не должен каким-либо образом влиять на одновременное выполнение других аналогичных потоков. Параллельно запускаемые потоки никак между собой не взаимодействуют. Т.е. необходимо чтобы каждый поток работал только со своими экземплярами данных и никак не мог испортить значения переменных, используемых другим потоком.

Грубо говоря есть некий класс DataMultiLoader, содержащий метод Load_and_Export

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class DataMultiLoader
{
        public DataMultiLoader(ServiceLogger p_svLogger)
        {
            svLogger = p_svLogger;
            cMTExporter = new Farelogix.MTExport.FQ_Exporter();
        }
    
    public void Load_and_Export(eProviders p_Provider, int p_nRRKey, RoutesLoadScheduler p_RScheduler)
        {   
        // здесь выполняется много работы с вызывом методов других классов, в том числе и статических
            ...
    }
 
}
Отдельная процедура LoadMultiThreading, которая вызывается по таймеру, должна запускать Load_and_Export из класса DataMultiLoader в рамках отдельного изолированного потока.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private void LoadMultiThreading(eBookingProviders p_Provider, int p_nRRKey) {
 
DataMultiLoader amdLoader = new DataMultiLoader(amdLogger);
 
...
Thread amdThread;
ThreadStart thStart;
 
thStart = delegate () { amdLoader.Load_and_Export(p_Provider, nSelectedRRKey, oRScheduler); };
amdThread = new System.Threading.Thread(thStart);
amdThread.Priority = ThreadPriority.AboveNormal;
amdThread.IsBackground = true;  
amdThread.Start();
...
}

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

Что надо добавить в существующий код, чтобы сделать его потокобезопасным?

Использование локальных блокировок данных с конструкциями типа
C#
1
2
3
lock(lockObj) {
// синхронизируемые операторы
}
является неприемлемым из-за большого объёма существующего кода. По-хорошему здесь не нужна какая-либо синхронизация изменения данных, а нужна полная изолированность, как если бы процедура Load_and_Export запускалась в рамках отдельного процесса.

Можно ли достичь нужного результата если оформить класс DataMultiLoader следующим образом?

C#
1
2
3
4
5
6
7
8
9
[Synchronization]
public class DataMultiLoader: ContextBoundObject
{.
    public void Load_and_Export(eProviders p_Provider, int p_nRRKey, RoutesLoadScheduler p_RScheduler)
        {   
            ...
    }
}
Не будет ли в этом случае один поток, вызвавший Load_and_Export, ждать завершения этого же метода, вызванного ранее другим потоком из-за его полной блокировки ?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.06.2021, 12:17
Ответы с готовыми решениями:

Легкая переделка для использования с двумерным массивом
Изначально писал прогу для использования с одномерным массивом, но возникла потребность в использовании функции для каждой строки...

Ошибка при попытке использования многопоточности в моделировании системы массового обслуживания
Всем привет! Попытался смоделировать СМО при одном источнике нагрузки со средним интервалом поступления заявок 0.5 и двумя обслуживающими...

Соотношение многопоточности приложения c++ и многопоточности на уровне системы?
Возник следующий вопрос: в C++ существует два варианта работы с многопоточностью - std::theard и использование mutex. Но, оба этих...

8
 Аватар для Midian
606 / 388 / 198
Регистрация: 31.03.2013
Сообщений: 2,690
16.06.2021, 14:03
Ну так полностью изолируйте работу потока с данными, чтобы потоки никаким образом не пересекались с переменными используемыми в другом потоке и будет вам счастье. Если, как вы говорите, у вас создается класс и внутри него уже методы, которые обрабатывают данные и получают, то в каждом новом потоке создавайте объект этого класса и он будет изолирован для остальных потоков, единственное, что наверное придется лочить, это работу со статик классами, смотря конечно что там внутри них происходит и че они там обрабатывают, вызывают и принимают
0
0 / 0 / 0
Регистрация: 16.06.2021
Сообщений: 5
16.06.2021, 14:23  [ТС]
Если, как вы говорите, у вас создается класс и внутри него уже методы, которые обрабатывают данные и получают, то в каждом новом потоке создавайте объект этого класса и он будет изолирован для остальных потоков
хорошо, если так.

единственное, что наверное придется лочить, это работу со статик классами, смотря конечно что там внутри них происходит и че они там обрабатывают, вызывают и принимают
а вот тут можно по подробнее?
как правильно оформить статичные классы, чтобы сделать их поля и методы изолированными при параллельном использовании их разными потоками ?
0
 Аватар для Midian
606 / 388 / 198
Регистрация: 31.03.2013
Сообщений: 2,690
16.06.2021, 14:36
Цитата Сообщение от Sergey345 Посмотреть сообщение
как правильно оформить статичные классы, чтобы сделать их поля и методы изолированными при параллельном использовании их разными потоками ?
Ну тут в целом такой же подход, статик если принимает какие-то данные, то эти данные должны относиться к конкретному объекту, с которым работает поток, если это не так, значит нужно его лочить, либо переделать его логику обработки данных. Мы же понимаем, что статик классы (Helper/Utils) и их методы, это обычно какие-то внешние ресурсы вне объекта который их использует. Поэтому нужно смотреть, чтобы эти методы не рабтали с общими ресурсами которые могут использовать разные потоки, либо это учитывать и лочить.
0
0 / 0 / 0
Регистрация: 16.06.2021
Сообщений: 5
16.06.2021, 15:01  [ТС]
Поэтому нужно смотреть, чтобы эти методы не рабтали с общими ресурсами которые могут использовать разные потоки, либо это учитывать и лочить.
что вы здесь вкладываете в понятие "Общие ресурсы" ?

если оформить статический класс в виде:
[Synchronization]
public static class xClass: ContextBoundObject

это сделает его поля и методы изолированными для разных потоков ?
0
 Аватар для Midian
606 / 388 / 198
Регистрация: 31.03.2013
Сообщений: 2,690
16.06.2021, 15:28
Цитата Сообщение от Sergey345 Посмотреть сообщение
что вы здесь вкладываете в понятие "Общие ресурсы" ?
Ну например в вашем случае, если это будет какое-то открытое статик поле и оно будет использоваться разными потоками при вызове статик метода для записи и чтения, тогда могут возникнуть проблемы

Добавлено через 8 минут
Цитата Сообщение от Sergey345 Посмотреть сообщение
[Synchronization]
Что касаемо данного атрибута, я его не использовал, читал о нем, он якобы гарантрирует что код класса будет использован только одним потоком, на сколько это гибкое решение не могу сказать

Добавлено через 5 минут
Вот что пишут о нем:
В некоторых отношениях этот подход выглядит как "ленивый" способ написания безопасного к потокам кода, учитывая, что не приходится углубляться в детали относительно того, какие именно аспекты типа действительно манипулируют чувствительными к потокам данными. Однако главный недостаток этого подхода состоит в том, что даже если определенный метод не использует чувствительные к потокам данные, CLR будет по-прежнему блокировать вызовы этого метода. Очевидно, что это приведет к деградации общей функциональности типа, поэтому используйте такую технику с осторожностью.
0
0 / 0 / 0
Регистрация: 16.06.2021
Сообщений: 5
16.06.2021, 15:43  [ТС]
Ну т.е. если переделать статик классы в обычные и в участках кода, где они вызывались каждый раз создавать его новый экземпляр(объект) для вызова методов этого класса, то это сделает все поля и методы этого класса изолированными в рамках вызывающего потока ?
0
 Аватар для Midian
606 / 388 / 198
Регистрация: 31.03.2013
Сообщений: 2,690
16.06.2021, 17:05
Цитата Сообщение от Sergey345 Посмотреть сообщение
Ну т.е. если переделать статик классы в обычные и в участках кода, где они вызывались каждый раз создавать его новый экземпляр(объект) для вызова методов этого класса, то это сделает все поля и методы этого класса изолированными в рамках вызывающего потока ?
Да, ну можно по разному делать, все зависит что у вас там в этих статик классах происходит, я ж не видел кода и не знаю
0
0 / 0 / 0
Регистрация: 16.06.2021
Сообщений: 5
16.06.2021, 17:32  [ТС]
ну ладно, и на том спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.06.2021, 17:32
Помогаю со студенческими работами здесь

Инструкция использования для программы
Всем Здравствуйте! В общем, нужно сделать Инструкцию использования программы, "Справка" Можете привести пример, или...

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

Переделка программы
Необходимо переделать программу под эти условия. Разработать информационно справочную систему для работы с базой данных. Входные данные: ...

Переделка программы с С++ на 1с
Доброго времени суток. Имеется код на плюсах, а нужен на 1с. Можете помочь? Условие задачи: Найти натуральные числа,...

Переделка программы
Доброе утро, переделайте пожалуйста программу. Такое условие - Аквариум объемом 15 имеет форму прямоугольного параллелепипеда с квадратным...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru