在异步方法中处理多个同步网络调用?

时间:2020-02-20 20:46:24

标签: c# multithreading asynchronous

在下面的示例中,我有一个带有标志异步调用的方法。

在该方法中,它将异步进行两个单独的网络调用,并在两个都被调用并且需要结果之后等待它们。一旦获得了两者的结果,它将调用一种方法,一次处理两个网络调用的结果。每个项目都需要一个网络调用,出于这个问题的目的,该网络调用不能设为异步,必须立即等待。

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 个答案:

答案 0 :(得分:2)

我的问题是Main()中的两个异步调用是否完成了任何事情,或者是否将它们同步处理。在使用两个原始线程处理ProcessItems中的每个项目之前,是否从那里激发了两个独立线程在FooAsync内部激发了另外两个独立线程?

异步与线程无关。使用async时,最好采用异步思想(intro; best practices),而不要考虑how they're related to threads

这两个FooAsync调用将同时处理,并且每个调用都会进行两个并发的HTTP调用。

旁注:做async all the way而不是blocking on async code是正常的。因此,Main中的代码将更自然地使用await Task.WhenAll(Task1, Task2);而不是Task.WaitAll(Task1, Task2);来表达。

相关问题