多个等待流程
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:
并行度。在这里,您依次创建两个任务,然后 await
以 Task.WhenAll()
完成所有任务
因此,这取决于您要查找的内容,如果第二个方法调用需要第一个方法的某些内容,则第一个选项是正确的。如果它们之间没有依赖关系,那么您正在寻找的是并行性,这是通过选项 2 实现的。
这其实和我之前的问题有关,我完全无法理解 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:
并行度。在这里,您依次创建两个任务,然后 await
以 Task.WhenAll()
因此,这取决于您要查找的内容,如果第二个方法调用需要第一个方法的某些内容,则第一个选项是正确的。如果它们之间没有依赖关系,那么您正在寻找的是并行性,这是通过选项 2 实现的。