多个等待流

时间:2018-06-25 10:26:39

标签: c#-4.0 async-await

这实际上与我先前的问题有关,我有能力理解多次等待。 我知道异步中的一个等待状态是await被“暂停” async方法直到该操作完成。但是我无法理解2次异步。

我想调用两个api以异步获取数据,然后基于此执行一些工作。 我有两个选择,我不确定该怎么办。我尝试了几篇文章,但由于无法找到任何具有良好图表说明的内容而无法理解。

如果选项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 个答案:

答案 0 :(得分:0)

选项1:

序列。无论是否使用await,方法中的代码都是顺序的,即:方法的第一行执行,第二行直到第一个结束才返回,然后将控制返回给调用方法。是否使用它的区别在于,执行awaited操作时,执行您的方法的线程将可用。如果您要处理另一个系统,即IE:数据库,这真的很有用。您可以等待一个SELECT语句,这样可以防止执行带有选择的方法的线程被阻塞,直到数据库响应为止。

选项2:

平行主义。在这里,您依次创建两个任务,然后为await创建Task.WhenAll()

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