Я пытаюсь понять параллельное программирование и хочу, чтобы мои методы async
работали в нескольких потоках. Я что-то написал, но это не работает, как я думал.
Код
public static async Task Main(string[] args)
{
var listAfterParallel = RunParallel(); // Running this function to return tasks
await Task.WhenAll(listAfterParallel); // I want the program exceution to stop until all tasks are returned or tasks are completed
Console.WriteLine("After Parallel Loop"); // But currently when I run program, after parallel loop command is printed first
Console.ReadLine();
}
public static async Task<ConcurrentBag<string>> RunParallel()
{
var client = new System.Net.Http.HttpClient();
client.DefaultRequestHeaders.Add("Accept", "application/json");
client.BaseAddress = new Uri("https://jsonplaceholder.typicode.com");
var list = new List<int>();
var listResults = new ConcurrentBag<string>();
for (int i = 1; i < 5; i++)
{
list.Add(i);
}
// Parallel for each branch to run await commands on multiple threads.
Parallel.ForEach(list, new ParallelOptions() { MaxDegreeOfParallelism = 2 }, async (index) =>
{
var response = await client.GetAsync("posts/" + index);
var contents = await response.Content.ReadAsStringAsync();
listResults.Add(contents);
Console.WriteLine(contents);
});
return listResults;
}
Я хотел бы, чтобы функция RunParallel завершилась до того, как будет напечатано «После параллельного цикла». Также я хочу, чтобы мой метод получения сообщений выполнялся в нескольких потоках.
Любая помощь будет оценена по достоинству!
async/await
не предназначены для параллелизма, они помогают с асинхронными операциями.Parallel.ForEach
предназначен для параллелизма данных (локальная обработка 100K/1M элементов) и определенно не предназначен для асинхронной работы. Фактически, он не может ожидать каких-либо асинхронных операций. Этот код будет запускать все запросы одновременно и никогда не будет получать результаты. - person Panagiotis Kanavos   schedule 04.10.2019var results = Task.WhenAll(Enumerable.Range(1,5).Select(i=>client.GetStringAsync($"posts/{i}")));
, чтобы запустить все 5 задач и дождаться их результатов без блокировки. - person Panagiotis Kanavos   schedule 04.10.2019