Обработка элементов в несколько потоков: ThreadPool или еще варианты? - C#

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

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

Во общем дело такое: Есть listview в нем N итемов, мне нужно пройтись по каждому взять данные каждого итема и записать их в файл, и хочу это сделать через потоки, но как сделать не могу понять... Потоков должно быть 20 максимум и нужно что бы было так: Первый поток берет первый итем и работает с ним. Второй поток берет второй итем и работает с ним. ... Десятый поток берет десятый итем и работает с ним. И вот после этого нужно как то сделать так что б если первый поток закончит обработку своего итема он не брал тупо следующий а брал итем который еще не обработан и не находится в процессе обработки другим потоком. пока что единственное что придумал по этому пункту - сделать свойство итема и когда поток начинает обработку итема, то ставит свойство в состояние "Processing", а по завершению "Completed", и тогда другие потоки не будут трогать итемы которые в процессе обработки или уже обработаны. Если кто знает лучше вариант напишите. Ну а вот с самими потоками мне нужна помощь ибо не знаю как это сделать через ThreadPool так что б все было нормально и без косяков...

Решение задачи: «Обработка элементов в несколько потоков: ThreadPool или еще варианты?»

textual
Листинг программы
  1.             listBox1.Items.Add("Begin...");
  2.             ProcessingBegin();
  3.             int threadsCount = 10;
  4.             new Thread(() =>
  5.             {
  6.                 for (int i = 0; i < threadsCount; i++)
  7.                 {
  8.                     Thread t = new Thread(() =>
  9.                     {
  10.                         foreach (ListViewItem item in items)
  11.                         {
  12.                             Thread.Sleep(2000);
  13.                             Invoke((Action)(() =>
  14.                             {
  15.                                 item.SubItems[3].ForeColor = Statuses.Success.Color;
  16.                                 item.SubItems[3].Text = Statuses.Success.Message;
  17.                             }));
  18.                         }
  19.                     });
  20.                     t.Start();
  21.                     t.Join();
  22.                 }
  23.                 Invoke((Action)(() =>
  24.                 {
  25.                     ProcessingEnd();
  26.                     listBox1.Items.Add("End...");
  27.                 }));
  28.             }).Start();

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


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

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

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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы