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

Prodvigay

Client
Joined
May 23, 2015
Messages
37
Reaction score
5
Points
8
Всем привет!)
Не пользовался зенкой пару лет, ранее использовал её когда работал в вебстудии для заполнения клиентских интернет магазинов. Делал все в 1 поток, мне этого хватало.

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

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

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

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

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

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

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

Attachments

Bablozavr

Client
Joined
Jan 26, 2018
Messages
309
Reaction score
164
Points
43
Если уж встал на путь многопоточности, то и очистку от повторов делай используя C# и lock(SyncObjects.ListSyncer)
С файлами же работаешь, а значит другого пути нет (но это не точно).

upd: Вот так например
Code:
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);
}
 
Last edited:

Prodvigay

Client
Joined
May 23, 2015
Messages
37
Reaction score
5
Points
8
Если уж встал на путь многопоточности, то и очистку от повторов делай используя C# и lock(SyncObjects.ListSyncer)
С файлами же работаешь, а значит другого пути нет (но это не точно).

upd: Вот так например
Code:
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
Joined
Jan 26, 2018
Messages
309
Reaction score
164
Points
43
Все работает, я проверил перед публикацией :-)
 

Users Who Are Viewing This Thread (Total: 1, Members: 0, Guests: 1)