c#-4.0 - 多个等待流程
问题描述
它实际上与我之前的问题有关,我完全有能力理解多个 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;
}
解决方案
选项1:
顺序。不管有没有await
,方法中的代码是顺序的,即:方法的第一行执行,第二行直到第一行结束,然后将控制权返回给调用方法。使用与否的区别在于,执行您的方法的线程将在awaited
操作运行时可用。如果您正在处理另一个系统,即 IE:数据库,这非常有用。您可以等待一个SELECT
语句,这样做可以防止执行带有 select 的方法的线程被阻塞,直到数据库响应。
选项 2:
并行性。在这里,您依次创建两个任务,然后await
完成所有任务Task.WhenAll()
因此,这取决于您要查找的内容,如果第二个方法调用需要第一个方法调用中的某些内容,则第一个选项是正确的。如果它们之间没有依赖关系,那么您正在寻找的是并行性,这是通过选项 2 实现的。
推荐阅读
- docker - 无法通过 traefik 将流量路由到 docker 容器
- excel - 在 Excel 中从没有重复的集合中选择一个随机数
- python - 凯撒密码程序的 UnboundLocalError
- php - 使用 PHP 在文件夹中上传图像
- java - RecyclerView 没有出现
- go - 从 os.Args [1] 读取时,golang 文件名太长错误
- mongoose - 继续获取 mongoose.Promise 必须是一个函数,得到了 bluebird
- python - 什么模型(损失函数等)可以在 Keras 中用于使用概率标签而不是 one-hot 编码进行分类训练
- node.js - 如何通过我的 IP 地址和路由器端口转发运行 Node 服务器
- html - 如何让我的页脚不阻止 HTML 中的 div 部分?