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

Узнай цену своей работы

Формулировка задачи:

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

Решение задачи: «Как согласовать работу потоков с данными»

textual
Листинг программы
         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));

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4 из 5