首页 > 解决方案 > 多个等待流程

问题描述

它实际上与我之前的问题有关,我完全有能力理解多个 await 。我知道异步中的一个等待是在 该操作完成之前await“暂停”该async方法。但是我无法理解 2 async。

我想调用两个 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;
                }

标签: c#-4.0async-await

解决方案


选项1:

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

选项 2:

并行性。在这里,您依次创建两个任务,然后await完成所有任务Task.WhenAll()

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


推荐阅读