这实际上与我先前的问题有关,我有能力理解多次等待。
我知道异步中的一个等待状态是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;
}
答案 0 :(得分:0)
选项1:
序列。无论是否使用await
,方法中的代码都是顺序的,即:方法的第一行执行,第二行直到第一个结束才返回,然后将控制返回给调用方法。是否使用它的区别在于,执行awaited
操作时,执行您的方法的线程将可用。如果您要处理另一个系统,即IE:数据库,这真的很有用。您可以等待一个SELECT
语句,这样可以防止执行带有选择的方法的线程被阻塞,直到数据库响应为止。
选项2:
平行主义。在这里,您依次创建两个任务,然后为await
创建Task.WhenAll()
因此,这取决于您要查找的内容,如果第二个方法调用需要第一个方法的某些内容,则第一个选项是正确的。如果它们之间没有依赖性,那么您正在寻找的是并行性,这是通过选项2实现的。