#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}"); }
Комментариев нет:
Отправить комментарий