Обработка нескольких синхронных сетевых вызовов внутри асинхронных методов? - PullRequest
0 голосов
/ 20 февраля 2020

В приведенном ниже примере у меня есть метод, который вызывается асинхронно с флагом.

Внутри метода он выполняет два отдельных сетевых вызова асинхронно и ожидает их после того, как оба были вызваны, и результат необходимо. Получив оба результата, он вызовет метод, который обрабатывает результаты двух сетевых вызовов по одному. Каждый элемент требует сетевого вызова, который для целей этого вопроса не может быть сделан асинхронным и должен ожидаться немедленно.

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 с использованием двух исходных потоков?

1 Ответ

2 голосов
/ 21 февраля 2020

Мой вопрос заключается в том, выполняет ли два асинхронных вызова в Main () что-нибудь или они будут обрабатываться синхронно. Оттуда запускаются два независимых потока, которые запускают еще два независимых потока внутри FooAsyn c перед обработкой каждого элемента в ProcessItems с использованием двух исходных потоков?

Асинхронность имеет очень мало общего с потоками. При работе с async лучше принять асинхронный менталитет ( введение ; лучшие практики ), а не думать о , как они связаны с потоками .

Два FooAsync вызова будут обрабатываться одновременно, и каждый из них будет делать два одновременных HTTP-вызова.

Примечание: обычно asyn c all обычно способ , а не блокировка на асин c код . Таким образом, код в Main будет более естественно выражаться с использованием await Task.WhenAll(Task1, Task2);, а не Task.WaitAll(Task1, Task2);.

...