Учитывая определенное количество объектов запроса (макс. 9), мне нужно вызывать конечную точку веб-службы одинаковое количество раз асинхронно. С .NET 4.0
мы использовали delegate
и IAsyncResult
для достижения этой цели.
Есть ли лучший способ сделать это с asyc/await
, TPL
или с обоими в сочетании с .NET 4.6.1
?
Будет ли использование Parallel.ForEach
с ConcurrentBag
оптимальным, как предложено в этом ответе ?
Пример синхронного кода:
public List<WbsResponse> GetWbsResults()
{
List<WbsRequest> requests = CompileWbsRequests();
List<WbsResponse> results = new List<WbsResponse>();
foreach (var request in requests)
{
//Call same web service endpoint n number of times
var response = CallWebService(request);
results.Add(response);
}
//do something with results
return results;
}
private WbsResponse CallWebService(WbsRequest request)
{
//Call web service
}
Редактировать / обновить 1 : На основе ответа @ Thierry я создал пример кода, предполагая, что в объектах запроса и ответа есть свойство Order
для пометки порядка запроса / ответа:
public List<WbsResponse> GetWbsResults()
{
List<WbsRequest> requests = CompileWbsRequests();
List<WbsResponse> results = new List<WbsResponse>();
Parallel.ForEach(requests, (request) => {
var response = CallWebService(request);
response.Order = request.Order;
results.Add(response);
});
results = results.OrderBy(r => r.Order).ToList();
//do something with results
return results;
}
private WbsResponse CallWebService(WbsRequest request)
{
//Call web service
}
Редактировать / обновить 2 : На основе этой темы я внес несколько изменений в Обновление 1:
await Task.Run(() => {
Parallel.ForEach(requests, (request) => {
var response = CallWebService(request);
response.Order = request.Order;
results.Add(response);
});
});
Сводка требований:
- Выполнение нескольких запросов веб-службы асинхронно к одной и той же конечной точке с разными параметрами.
- Добавление результатов веб-службы в список в том же порядке, в котором был сделан запрос (как если бы он был синхронным).