Страницы

Поиск по вопросам

воскресенье, 29 декабря 2019 г.

Как правильно распараллелить процесс парсинга?

#c_sharp #многопоточность


В таймере каждые 10-сек делаю запрос на 3 разных сайта. Хочу параллельно запустить
эти три запроса и ждать пока они все отработают. Как это правильней всего сделать?

 private void button1_Click(object sender, EventArgs e) {
   aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);

   aTimer.Interval = 10000;
   if (button1.Text == "Старт") {
    aTimer.Enabled = true;
    button1.Text = "Стоп";
   } else {
    aTimer.Enabled = false;
    button1.Text = "Старт";

   }

  }

  private void OnTimedEvent(object source, ElapsedEventArgs e) {
   Run();
  }
  public void Run() {
   var site1 = getKeys("url1");
   var site2 = getKeys("url2");
   var site3 = getKeys("url3");
   // дальше идут определенные операции с переменными site1,site2 и site3

  }

    


Ответы

Ответ 1



Самый простой и быстрый способ это сделать, это запустить Task на каждый запрос: public void Run() { var siteTask1 = Task>.Run(() => getKeys("url1")); var siteTask2 = Task>.Run(() => getKeys("url2")); var siteTask3 = Task>.Run(() => getKeys("url3")); Task.WaitAll(siteTask1, siteTask2, siteTask3); var site1 = siteTask1.Result; var site2 = siteTask2.Result; var site3 = siteTask3.Result; } В Task> IEnumerable это тот тип данных корый возвращает метод getKeys.

Ответ 2



Для распараллеливания задач в .NET существует класс Parallel, который является частью TPL, a так же PLINQ – еще более высокоуровневая абстракция. Используя PLINQ: var urls = new[] { "url1", "url2", "url3" }; var urlsAndKeys = (from url in urls.AsParallel() select new { url, key = getKey(url) }).ToList(); urlsAndKeys.ForEach(Console.WriteLine); Если вас пугает PLINQ, можно использовать TPL напрямую: var urls = new[] { "url1", "url2", "url3" }; var results = new Dictionary(); Parallel.ForEach(urls, url => { var key = getKey(url); lock (results) { results.Add(url, key); } }); foreach (var urlAndKey in results) { Console.WriteLine($"URL: {urlAndKey.Key}, Key: {urlAndKey.Value}"); }

Комментариев нет:

Отправить комментарий