В приведенном ниже примере у меня есть метод, который вызывается асинхронно с флагом.
Внутри метода он выполняет два отдельных сетевых вызова асинхронно и ожидает их после того, как оба были вызваны, и результат необходимо. Получив оба результата, он вызовет метод, который обрабатывает результаты двух сетевых вызовов по одному. Каждый элемент требует сетевого вызова, который для целей этого вопроса не может быть сделан асинхронным и должен ожидаться немедленно.
private HttpClient client = new HttpClient();
static async Task Main()
{
var task1 = FooAsync(true);
var task2 = FooAsync(false);
Task.WaitAll(Task1, Task2);
// Do some stuff with the results
}
private async Task<List<int>> FooAsync(bool input)
{
HttpResponseMessage response1 = client.GetAsync("https://baseUrlX/" + input.ToString());
HttpResponseMessage response2 = client.GetAsync("https://baseUrlY/" + input.ToString());
string content1 = await response1.Content.ReadAsStringAsync();
string content2 = await response2.Content.ReadAsStringAsync();
return ProcessItems(content1, content2);
}
private async Task<List<int>> ProcessItemsAsync(string content1, string content2)
{
List<int> results = new List<int>();
string content = content1 + content2;
foreach(char c in content)
{
var response = client.GetAsync("https://someUrl/" + c);
string content = await response.Content.ReadAsStringAsync(); // Blocking call here
results.Add(Int.Parse(content));
}
return results;
}
Мой вопрос заключается в том, выполняет ли два асинхронных вызова в Main()
что-нибудь или если они будут обрабатываться синхронно. Оттуда запускаются два независимых потока, которые запускают еще два независимых потока внутри FooAsync
перед обработкой каждого элемента в ProcessItems
с использованием двух исходных потоков?