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

Discussion in 'Вопросы новичков' started by Prodvigay, Feb 14, 2019 at 12:40 PM.

  1. Prodvigay

    Prodvigay Client

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

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

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

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

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

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

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

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

    Attached Files:

  2. Bablozavr

    Bablozavr Client

    Joined:
    Jan 26, 2018
    Messages:
    102
    Likes Received:
    57
    Если уж встал на путь многопоточности, то и очистку от повторов делай используя C# и lock(SyncObjects.ListSyncer)
    С файлами же работаешь, а значит другого пути нет (но это не точно).

    upd: Вот так например
    Code (text):
    1. lock(SyncObjects.ListSyncer) {
    2.    List<string> url_list = project.Lists["url"].ToList();
    3.    project.Lists["url"].Clear();
    4.    url_list = url_list.Distinct().ToList();
    5.    project.Lists["url"].AddRange(url_list);
    6. }
     
    Last edited: Feb 14, 2019 at 1:46 PM
    Prodvigay likes this.
  3. Prodvigay

    Prodvigay Client

    Joined:
    May 23, 2015
    Messages:
    37
    Likes Received:
    5
    Этот код удаляет повторяющиеся строки? Не совсем понял как) только что попробовал запустить, дубли строк остаются
    А нет) кажется удаляет)))
     
  4. Bablozavr

    Bablozavr Client

    Joined:
    Jan 26, 2018
    Messages:
    102
    Likes Received:
    57
    Все работает, я проверил перед публикацией :-)
     

Пользователи просматривающие тему (Пользователей: 0, Гостей: 0)