首页 > 解决方案 > 使用 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

我的假设是否正确并且我执行错误还是应该使用其他解决方案?

标签: c#multithreadingthread-safetyrestsharpparallel.foreach

解决方案


我还希望请求是并行的

你真正想要的是并发请求。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;
}

推荐阅读