Потоки мешают друг другу работать со списком

Enigma

Client
Регистрация
16.06.2017
Сообщения
187
Благодарностей
31
Баллы
28
Есть проблема: потоки мешают друг другу работать со списком, привязанном к файлу. Один поток обрабатывает список, вносит туда изменения, но один из параллельных потоков (изредка) делает то же самое, хотя по идее не должен.

Шаблон работает в 5 потоков: они парсят определенную веб-страничку в ожидании определенного "события" на ней. В момент появления этого "события" между пятью потоками происходит драка за то, чтобы первым успеть взять "событие" в работу (а остальные 4 будут ждать другого случая). Если более подробно, выглядит это так:

Когда на страничке появляется "событие", у него есть ID (пишется прямо на страничке). Каждый из 5 потоков мгновенно парсит этот ID, ложит в локальную переменную id1 и тут же ищет совпадение в списке ID_used (привязан к файлу) на предмет того, а не взял ли уже этот ID в работу другой параллельный поток. Если в списке ID_used этого ID еще нет, то он туда записывается, чтобы остальным потокам вернулся ответ "ID уже занят". Был уверен, что такая схема будет работать безотказно, но тесты показали, что иногда в список ID_used один и тот же ID записывается дважды, т.е. сразу оба потока берут его в работу! Хотя поначалу мне казалось это невозможным, ведь, судя по С# коду, список лочится на время проверки, а значит очередь между потоками хоть в доли секунд, но все же должна быть. Я думал, этого времени должно быть достаточно, чтобы между потоками не было конфликта. В общем, прошу подсказки, как реализовать эту схему более грамотно. Схема нынешней реализации представлена ниже:
berem.PNG
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 620
Благодарностей
4 607
Баллы
113
Добавлять строку нужно внутри приведенного кода перед последней закрывающей фигурной скобкой
 

Enigma

Client
Регистрация
16.06.2017
Сообщения
187
Благодарностей
31
Баллы
28
Насколько я понимаю, кубик добавления строки нужно предварительно преобразовать в С#. Помогите, пожалуйста, сделать это...
 

Enigma

Client
Регистрация
16.06.2017
Сообщения
187
Благодарностей
31
Баллы
28
Нашел такой вариант, протестирую и отпишусь и результатах

// берем из переменной текст, который надо искать
var textContains = project.Variables["Text"].Value;
// получаем список, в котором будем искать
var sourceList = project.Lists["Список"];
// ищем в каждой строчке в списке
lock (SyncObjects.ListSyncer)
{
for (int i = 0; i < sourceList.Count; i++)
{
// читаем строку из списка
var str = sourceList;
// проверяем содержание текста в строке, если есть совпадение, возвращаем "no"
if (str.Contains(textContains))
return "no";
//return null; // если раскомментировать эту строку, а предыдущую закомментировать (или удалить), выход будет по красной ветке (как вариант)
}
}
// если нет совпадений, добавляем строку в список
sourceList.Add(textContains);
 

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