Почему-то не срабатывает локер lock(SyncObjects.ListSyncer)

ilyaogurtzov

Новичок
Регистрация
26.01.2023
Сообщения
18
Благодарностей
0
Баллы
1
Есть список с данными. Кубик выполняю через C## по коду

lock(SyncObjects.ListSyncer){
project.Variables["IDAccount"].Value = project.Lists["Accounts"][0].Trim();
project.Lists["Accounts"].RemoveAt(0);
}


Локирую список, беру строку с удалением и, если все ок, работаю с ней. Я так понимаю, что в многопотоке потоки должны ждать друг друга. Но у меня почему-то не срабатывает и потоки берут одинаковык данные в работу. В чем может быть ошибка?

Этот код выполняется 1 раз на входе и в самом конце добавляется обратно в список (после выполнения)
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113

ilyaogurtzov

Новичок
Регистрация
26.01.2023
Сообщения
18
Благодарностей
0
Баллы
1
шаблон один и тот же или разные шаблоны вызывают этот код ?
Шаблон один, больше никто не вызывает. Сам кубик вызывается в самом начале и, если строка не подходит, то закидывается в конец списка. В списке более 1000 строк.
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
Шаблон один, больше никто не вызывает. Сам кубик вызывается в самом начале и, если строка не подходит, то закидывается в конец списка. В списке более 1000 строк.
и как часто данные пересекаются ? сколько потоков запускается и сколько пересекаются ?
 

ilyaogurtzov

Новичок
Регистрация
26.01.2023
Сообщения
18
Благодарностей
0
Баллы
1
и как часто данные пересекаются ? сколько потоков запускается и сколько пересекаются ?
Это все хорошие вопросы, но надо анализировать, только поймал проблему и проверил, что действительно есть косяки.
Перескаются ~10% случаев, количество потоков 10-20
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113

ilyaogurtzov

Новичок
Регистрация
26.01.2023
Сообщения
18
Благодарностей
0
Баллы
1
Спасибо, буду переделывать
 

DevOps

Client
Регистрация
30.11.2020
Сообщения
496
Благодарностей
314
Баллы
63
Такая проблема часто случается не только у Вас, даже при использовании виртуальных листов (в случае с физическими можно было бы списать на задержку чтения/записи самого контролера
Используйте потокобезопасные коллекции ConcurrentQueue
Из плюсов - не нужно лочить лист из за чего падает скорость обработки.
Очень удобно когда Вам нужно сделать многопоточное приложение которое имеет "обработку с ожиданием", например при обращении к серверу. Такие потоки можно сделать асинхронными (это проще чем регулировать количество асинхронных потоков из одного главного) и намного повысить производительность программы.
C#:
            string path = @"путь к файлу";
            var lines = File.ReadLines(path);
            ConcurrentQueue<string> inQueue = new ConcurrentQueue<string>();
            foreach (string line in lines)
            {
                inQueue.Enqueue(line);
               // заполняем коллекцию с файла
            }

            // Запуск 10 потоков для чтения данных из очереди
            Thread[] threads = new Thread[10];
            for (int i = 0; i < threads.Length; i++)
            {
                threads[i] = new Thread(ReadFromQueue);
                threads[i].Start();
            }

            // Ожидание завершения потоков
            foreach (Thread t in threads)
            {
                t.Join();
            }
     

        static async void ReadFromQueue()
        {
             while (true)
            {
                string data;
                if (!inQueue.TryDequeue(out data))
                {
                    // Если очередь пуста, завершаем работу потока
                    return;
                }
                else
                {
                    // если очередь не пуста что то тут делаем

                 }

            }
         }
)

PS Юзинг не забудьте
C#:
using System.Collections.Concurrent;
 
Последнее редактирование:
  • Спасибо
Реакции: ilyaogurtzov

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)