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

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

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

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

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

textual
Листинг программы
            listBox1.Items.Add("Begin...");
            ProcessingBegin();
            int threadsCount = 10;
            new Thread(() =>
            {
                for (int i = 0; i < threadsCount; i++)
                {
                    Thread t = new Thread(() =>
                    {
                        foreach (ListViewItem item in items)
                        {
                            Thread.Sleep(2000);
                            Invoke((Action)(() =>
                            {
                                item.SubItems[3].ForeColor = Statuses.Success.Color;
                                item.SubItems[3].Text = Statuses.Success.Message;
                            }));
                        }
                    });
                    t.Start();
                    t.Join();
                }
                Invoke((Action)(() =>
                {
                    ProcessingEnd();
                    listBox1.Items.Add("End...");
                }));
            }).Start();

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


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

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

13   голосов , оценка 3.923 из 5
Похожие ответы