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