【问题标题】:Handling multiple synchronous network calls within asynchronous methods?在异步方法中处理多个同步网络调用?
【发布时间】:2020-02-20 20:46:24
【问题描述】:

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

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

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() 中的两个异步调用是否完成了任何事情,或者它们是否会被同步处理。在使用两个原始线程处理ProcessItems 中的每个项目之前,是否有两个独立线程从那里触发,它们在FooAsync 中触发了另外两个独立线程?

【问题讨论】:

  • 2 个FooAsync 调用将异步运行。 Task.WaitAll 将阻塞直到两者都完成,但任务本身将并行运行。
  • 如果你能发布真实的代码就好了。为了编译它,我必须对您的代码进行大量更改。如果我们不得不使用您的代码,这将很难回答。

标签: c# multithreading asynchronous


【解决方案1】:

我的问题是 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); 会更自然地表达。

【讨论】:

    猜你喜欢
    • 2017-06-02
    • 1970-01-01
    • 2019-05-12
    • 1970-01-01
    • 2014-05-21
    • 2011-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多