Вопрос по многопоточности

Prodvigay

Client
Регистрация
23.05.2015
Сообщения
37
Благодарностей
5
Баллы
8
Всем привет!)
Не пользовался зенкой пару лет, ранее использовал её когда работал в вебстудии для заполнения клиентских интернет магазинов. Делал все в 1 поток, мне этого хватало.

Сейчас появилось куча задач, которые нужно автоматизировать. Хочу углубиться в изучение данной программы. Решил написать простой парсер всех урл сайта. Что бы на выходе получить полный список всех страниц.

Написал простой шаблон, работает без браузера, реализовал вот так:

1. Берем урл из списка url
2. Проверяем этот урл в спике result
3. Если есть в списке result, берем следующий урл, если нет, переходим к следующему шагу
4. Получаем ХТМЛ страницы
5. Получаем все урл из ХТМЛ, записываем в список url, удаляем дубли.
6. Записываем урл обработанной страницы в список result

Сначала шаблон был зациклен, работало в 1 поток, решил ускорить процесс...

Поискал темы по многопоточности на этом форуме, пока понял лишь что нужно синхронизировать списки с файлами, тогда потоки не должны пересекаться.

Но при запуске нескольких потоков, некоторые потоки не могут выполниться, а именно не может выполниться удаление дублей в списке url. В логах вот что пишет:
"Выполнение действия List Коллекция была изменена; невозможно выполнить операцию перечисления"

Почему такое происходит не могу понять...
 

Вложения

Bablozavr

Client
Регистрация
26.01.2018
Сообщения
310
Благодарностей
163
Баллы
43
Если уж встал на путь многопоточности, то и очистку от повторов делай используя C# и lock(SyncObjects.ListSyncer)
С файлами же работаешь, а значит другого пути нет (но это не точно).

upd: Вот так например
Код:
lock(SyncObjects.ListSyncer) {
   List<string> url_list = project.Lists["url"].ToList();
   project.Lists["url"].Clear();
   url_list = url_list.Distinct().ToList();
   project.Lists["url"].AddRange(url_list);
}
 
Последнее редактирование:
  • Спасибо
Реакции: GSX_RU и Prodvigay

Prodvigay

Client
Регистрация
23.05.2015
Сообщения
37
Благодарностей
5
Баллы
8
Если уж встал на путь многопоточности, то и очистку от повторов делай используя C# и lock(SyncObjects.ListSyncer)
С файлами же работаешь, а значит другого пути нет (но это не точно).

upd: Вот так например
Код:
lock(SyncObjects.ListSyncer) {
    List<string> sys_orig_file = project.Lists["url"].ToList();
    project.Lists["url"].Clear();
    sys_orig_file = sys_orig_file.Distinct().ToList();
    project.Lists["url"].AddRange(sys_orig_file);
}
Этот код удаляет повторяющиеся строки? Не совсем понял как) только что попробовал запустить, дубли строк остаются
А нет) кажется удаляет)))
 

Bablozavr

Client
Регистрация
26.01.2018
Сообщения
310
Благодарностей
163
Баллы
43
Все работает, я проверил перед публикацией :-)
 

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