c# - 使用 Parallel.ForEach 并行创建多个请求并将它们放在列表中
问题描述
所以我必须创建几十个 API 请求并获取 json 以使其成为对象并将其放入列表中。我还希望请求是并行的,因为我不关心对象进入列表的顺序。
public ConcurrentBag<myModel> GetlistOfDstAsync()
{
var req = new RequestGenerator();
var InitializedObjects = req.GetInitializedObjects();
var myList = new ConcurrentBag<myModel>();
Parallel.ForEach(InitializedObjects, async item =>
{
RestRequest request = new RestRequest("resource",Method.GET);
request.AddQueryParameter("key", item.valueOne);
request.AddQueryParameter("key", item.valueTwo);
var results = await GetAsync<myModel>(request);
myList.Add(results);
});
return myList;
}
是什么造成了新问题,我不明白如何将它们放入列表中,而且似乎我没有使用表单中存在的解决方案ConcurrentBag
我的假设是否正确并且我执行错误还是应该使用其他解决方案?
解决方案
我还希望请求是并行的
你真正想要的是并发请求。Parallel
不能按预期使用async
。
要执行异步并发,您需要启动每个请求,但await
尚未执行任务。然后,您可以将await
所有任务放在一起并使用以下方法获取响应Task.WhenAll
:
public async Task<myModel[]> GetlistOfDstAsync()
{
var req = new RequestGenerator();
var InitializedObjects = req.GetInitializedObjects();
var tasks = InitializedObject.Select(async item =>
{
RestRequest request = new RestRequest("resource",Method.GET);
request.AddQueryParameter("key", item.valueOne);
request.AddQueryParameter("key", item.valueTwo);
return await GetAsync<myModel>(request);
}).ToList();
var results = await TaskWhenAll(tasks);
return results;
}
推荐阅读
- c# - VDS.RDF.GraphHandler 用于跳过三元组
- javascript - Php 域可用性检查器 - 需要 ajax 代码或类似代码来显示结果而无需重新加载站点
- google-cloud-sql - 从我的机器连接到 Google Cloud SQL
- firebase - 使用 Cloud Functions 观看带有 Firestore 的 collectionGroup
- javascript - 模糊父元素而不影响具有动态高度的子元素
- reactjs - 带有选项的反应路由器端点
- css - 为 Bootstrap 网格设置断点
- c# - Visual Studio 2019 右大括号不在左大括号下方(而是完全左对齐)
- mongodb - 使用烧瓶将数据保存到 mongodb 数据库时出错
- solr - 如何使用术语查询解析器调用 solr API