Как отправить несколько параллельно выполняющихся Http запросов?
Помогите разобраться, необходимо в программе на C# отправить сразу несколько Http-запросов при этом их выполнение должно идти параллельно, у меня есть следующий алгоритм:
1 Взять коллекцию адресов с которыми будем работать
ICollection<RtbModel> rtb_partners; // Адреса в интернете
2 Создать массив Task(ов), который будет сохранять полученные ответы
var bids = new Task<AuctionRequest>[rtb_partners.Count];
3 В цикле foreach начать перебор массива адресов с дальнешйшим выполнением запроса
foreach (var advert in rtb_partners)
{
await (bids[i++] = ProcessBidRequest(advert));
}
public async Task<AuctionRequest> ProcessBidRequest(string adress)
{
try
{
string address = adress;
using var request = new HttpRequestMessage(HttpMethod.Get, address);
{
using var response = await _client.SendAsync(request);
var respString = await response.Content.ReadAsStringAsync();
}
}
Как правильно написать метод ProcessBidRequest(), чтобы запрос отправлялись параллельно и на выходе были только ответы с успешным выполнением?
Ответы (1 шт):
Вам поможет Task.WhenAll, это аналог Promise.All JS, или CompositeFuture.All в java
Создаете таск для списока тасков и выставляете хендлер на обработку ответов по завершении всех.
пример из ссылки
using System;
using System.Collections.Generic;
using System.Net.NetworkInformation;
using System.Threading;
using System.Threading.Tasks;
public class Example
{
public static void Main()
{
int failed = 0;
var tasks = new List<Task>();
String[] urls = { "www.adatum.com", "www.cohovineyard.com",
"www.cohowinery.com", "www.northwindtraders.com",
"www.contoso.com" };
foreach (var value in urls) {
var url = value;
tasks.Add(Task.Run( () => { var png = new Ping();
try {
var reply = png.Send(url);
if (! (reply.Status == IPStatus.Success)) {
Interlocked.Increment(ref failed);
throw new TimeoutException("Unable to reach " + url + ".");
}
}
catch (PingException) {
Interlocked.Increment(ref failed);
throw;
}
}));
}
Task t = Task.WhenAll(tasks);
try {
t.Wait();
}
catch {}
if (t.Status == TaskStatus.RanToCompletion)
Console.WriteLine("All ping attempts succeeded.");
else if (t.Status == TaskStatus.Faulted)
Console.WriteLine("{0} ping attempts failed", failed);
}
}
// The example displays output like the following:
// 5 ping attempts failed