使用 Parallel.ForEach 并行创建多个请求并将它们放入列表中
Using Parallel.ForEach Create multiple requests in parallel and put them in the list
所以我不得不创建几十个 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
形式存在的解决方案
我的假设是否正确但实施有误,还是我应该使用其他解决方案?
I also wanted the requests to be parallel
你真正想要的是并发个请求。 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;
}
所以我不得不创建几十个 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
我的假设是否正确但实施有误,还是我应该使用其他解决方案?
I also wanted the requests to be parallel
你真正想要的是并发个请求。 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;
}