多个等待流程

Multiple await flow

这其实和我之前的问题有关,我完全无法理解 multiple await 。 我知道异步中的一个等待是 await 作为 "pausing" 方法 async 直到该操作是 complete.But 我无法理解 2 异步。

我想调用两个api来异步获取数据,然后在此基础上执行一些工作。 我有两个选择,但我不确定要做什么 do.I 尝试了几篇文章但无法理解,因为我找不到任何具有良好图表解释的内容。

如果选项 1 不错,有人可以吗?

public  void CombineData()
{     
    //**Option1:**
     var MyData = await getCP1();
     var MyData2 = await getCP2();    
     var myobj = MyData.Id+ MyData2.Id;
    //**Option2:**
    var MyData = getCP1();
    var MyData2= getCP2();
    await Task.WhenAll(MyData , MyData2 );
    var myob_2option = MyData.Id+ MyData2.Id;
    }
     public  async Task<MyData> getCp1()
     {
                    var httpClient = GetHttpClient();
                    string requestEndpoint = "localhost/numbers/Get";

                    HttpResponseMessage httpResponse = await _httpRequestPolicy.ExecuteAsync(() => httpClient.GetAsync(requestEndpoint));

                    IEnumerable<string> numbers = await httpResponse.Content.ReadAsAsync<IEnumerable<string>>();
                    return new InsuranceCompanyData();
                }
                public  async Task<MyData> getCP2()
                {
                    var httpClient = GetHttpClient();
                    string requestEndpoint = "localhost/numbers/Get";

                    HttpResponseMessage httpResponse = await _httpRequestPolicy.ExecuteAsync(() => httpClient.GetAsync(requestEndpoint));

                    IEnumerable<string> numbers = await httpResponse.Content.ReadAsAsync<IEnumerable<string>>();
                    return new InsuranceCompanyData();
                }

                private static HttpClient GetHttpClient()
                {
                    var httpClient = new HttpClient();
                    httpClient.BaseAddress = new Uri(@"http://localhost:2351/api/");
                    httpClient.DefaultRequestHeaders.Accept.Clear();
                    httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                    return httpClient;
                }

选项 1:

序列。不管有没有 await,方法中的代码都是顺序的,即:方法的第一行执行,第二行直到第一行结束,并将控制权返回给调用方法。使用与不使用的区别在于,执行您的方法的线程在 awaited 操作为 运行 时可用。如果您正在处理另一个系统,即数据库,这将非常有用。您可以等待 SELECT 语句,这样做可以防止执行带有 select 方法的线程被阻塞,直到数据库响应。

选项 2:

并行度。在这里,您依次创建两个任务,然后 awaitTask.WhenAll()

完成所有任务

因此,这取决于您要查找的内容,如果第二个方法调用需要第一个方法的某些内容,则第一个选项是正确的。如果它们之间没有依赖关系,那么您正在寻找的是并行性,这是通过选项 2 实现的。