Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
 Аватар для 1337trix
23 / 24 / 11
Регистрация: 04.12.2014
Сообщений: 422

Как согласовать работу потоков с данными

22.07.2017, 18:35. Показов 1614. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет, как можно согласовать разбор некоторого листы данных с помощью потока и отследить его выполнение?
Вот, например, есть такой такая функция:
C#
1
2
3
4
5
        private void TestingWork(string user, string namethread)
        {
            Thread.Sleep(TimePause(4000, 6000)); // Рандом значения паузы
            OutputMsg(String.Format("Значение: {0}   Поток: {1}", user, namethread));
        }
и есть такие вводные данные
C#
1
   List<string> users = new List<string> { "user1", "user2", "user3", "user4", "user5", "user6", "user7" };
Как можно написать функцию, которая создаст, например, 5 потоков и распределит по ним лист из пользователей
например:
1-5 поток выведет 1-5 пользователя, а те, потоки, которые закончили работу раньше других - займутся 6-7 пользователем?
(мои старые попытки написания такой функции либо вылетали, либо выводили несколько раз одного и того же пользователя)


Извиняюсь, за незнание подобного, изучал c# поверхностно и прочитанные статьи\учебники не давали об этом информации, либо я ее не смог усвоить в свое время.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.07.2017, 18:35
Ответы с готовыми решениями:

Потоки! Как сделать работу потоков по очереди?
Всем привет! Помогите разобраться! Дано: 5 потоков, они генерят по очереди сообщения. public class Main { public static void...

Как разграничить работу трех потоков и избежать конфликтов
Подскажите пожалуйста, впервые сталкиваюсь, наработок пока особо нет, то,что нашла касается только моделирования работы потоков, то есть...

Как организовать корректную работу потоков с одним файлом
private void button1_Click(object sender, EventArgs e) { for (int p = 0; p &lt; 2; p++) { ...

5
 Аватар для Fleder
263 / 224 / 108
Регистрация: 09.12.2015
Сообщений: 652
22.07.2017, 18:55
Можно так:
C#
1
2
3
4
5
6
7
8
9
private void TestingWork(string user)
{
      Thread.Sleep(TimePause(4000, 6000)); // Рандом значения паузы
      OutputMsg(String.Format("Значение: {0}   Поток: {1}", user, Thread.CurrentThread.ManagedThreadId));
}
 
List<string> users = new List<string> { "user1", "user2", "user3", "user4", "user5", "user6", "user7" };
 
Parallel.ForEach(users, TestingWork);
Каждый user будет обработан в потоке, взятом из пула потоков. Обработка будет параллельной.
0
 Аватар для 1337trix
23 / 24 / 11
Регистрация: 04.12.2014
Сообщений: 422
22.07.2017, 19:06  [ТС]
Цитата Сообщение от Fleder Посмотреть сообщение
Можно так:
Интересное решение, конечно, благодарю, а как можно назначить выполнение, скажем по 5 потоков и тд? или для этого придется разбивать лист на несколько частей?
0
 Аватар для Fleder
263 / 224 / 108
Регистрация: 09.12.2015
Сообщений: 652
22.07.2017, 19:14
Можно воспользоваться перегруженной версией:
C#
1
2
3
4
5
6
7
8
9
10
11
private void TestingWork(string user)
{
      Thread.Sleep(TimePause(4000, 6000)); // Рандом значения паузы
      OutputMsg(String.Format("Значение: {0}   Поток: {1}", user, Thread.CurrentThread.ManagedThreadId));
}
 
List<string> users = new List<string> { "user1", "user2", "user3", "user4", "user5", "user6", "user7" };
 
ParallelOptions opt = new ParallelOptions();
opt.MaxDegreeOfParallelism = 5;
Parallel.ForEach(users, opt, TestingWork);
Можно задать максимальное число параллельных задач.
1
 Аватар для 1337trix
23 / 24 / 11
Регистрация: 04.12.2014
Сообщений: 422
23.07.2017, 09:25  [ТС]
Fleder, извиняюсь, есть вопрос в догонку...
как настроить Appartament STA
вот например, как с потоком
C#
1
threadWork.SetApartmentState(ApartmentState.STA);
Добавлено через 15 минут
Сделал через создание нового потока в функции, выглядит, глупо, конечно, но работает
Есть иное решение?)
(дополнение к прошлому сообщению)
0
 Аватар для Fleder
263 / 224 / 108
Регистрация: 09.12.2015
Сообщений: 652
23.07.2017, 13:34
1337trix,
Работа через потоки (Thread) напрямую - это уже устаревшая практика.
Возня с ними слишком геморройная, и применяется для исключительных случаев, когда, например, надо создать вторичный поток, который будет "жить" долго, а то и столько же, сколько и само приложение.

Если же нужна простая параллельная обработка данных - то плодить потоки (Thread) нет необходимости.
Можно поручить это библиотеке распараллеливания задач.

Добавлено через 16 минут
Правда, метод Parallel.ForEach(...) хоть и распараллеливает задачи, и они выполняются в разных потоках, он всё равно будет ждать окончания всех задач.
И если запустить его не в асинхронном режиме, то он на время своего выполнения "заморозит" вам ваш GUI.

Добавлено через 42 минуты
1337trix, чтобы не морозить интерфейсный поток, но обработать данные асинхронно в других потоках и узнать о результатах их обработки обратно в интерфейсном потоке можно, например, сделать так:
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
         private void TestingWork(string user)
         {
            //тут совершается обработка юзера во вторичном потоке
            {
               //...
               //...
               //...
               Thread.Sleep(TimePause(4000, 6000)); // Рандом значения паузы
            }
 
            //а тут мы пробрасываем результат обработки обратно в первичный(интерфейсный) поток и выводим на экран(форму)
            {
               SynchronizationContext context = SynchronizationContext.Current;
               context.Post(x =>
               {
                  OutputMsg(String.Format("Значение: {0}   Поток: {1}", user, Thread.CurrentThread.ManagedThreadId));
               }, null);
            }
         }
 
         List<string> users = new List<string> { "user1", "user2", "user3", "user4", "user5", "user6", "user7" };
 
         ParallelOptions opt = new ParallelOptions();
         opt.MaxDegreeOfParallelism = 5;
         Task.Run(() => Parallel.ForEach(users, opt, TestingWork));
Добавлено через 3 минуты
Но это не единственный вариант, можно ещё и через async / await.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.07.2017, 13:34
Помогаю со студенческими работами здесь

Как автоматизировать работу с данными
Всем доброго времени суток! Вопрос в следующем: имею необходимость заполнять данные из экселя (описание товаров при приемке от...

Как организовать работу с данными?
Здравствуйте господа! Пишу приглашу, не могу понять как правильней организовать загрузку данных с картинками в список сохранение в...

Как лучше организовать работу и взаимосвязь почти одинаковых потоков?
При запуске программы появляется окно, в которое вводятся параметры, нажимаем Ok, и теперь у нас на основе этих параметров создаются два...

Как лучше оптимизировать работу с данными БД
Здравствуйте. У меня в приложении есть функция работы с адресами из Кладр. Выглядит это как на скриншоте. Первоначально я хотел по...

Как лучше организовать работу Access с данными из разных файлов Excel
Задача в следующем. В базе Access есть список путей до типовых файлов Excel, откуда нужно взять данные. Связывание БД с этими...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
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