문제를 해결하는 방법을 알고 있는데 문제가 발생했습니다.API 호출을 비동기 적으로 수행
많은 제품이있는 웹 사이트가 있고이 페이지를 제품으로 채우기 위해 GetProducts
이라는 API 공급자의 메소드를 호출합니다. 이것은 잘 작동하지만이 요청을 작은 요청으로 분할하여 비동기 적으로 실행하여이 프로세스를 가속화하고 싶습니다. GetProducts
메서드는 pageNumber
매개 변수를 제공합니다.이 매개 변수는 레코드의 다른 페이지를 가져 오도록 할 수 있습니다.
그래서이 문제를 해결하기 위해 여러 가지 방법을 시도했지만 어디에도 없습니다. 코드 예제 :
int n = 0;
var tasks = new List<Task>();
// this method gets the total amount of products for the category
totalAmountOfProducts = MyApi.GetProductsCount(category);
while (n < totalAmountOfProducts/200)
{
for (int i = 0; i < 10; i++)
{
tasks.Add(GetProductsAsync(category, i, 200));
}
n += i;
Task t = Task.WhenAll(tasks.ToArray());
var totalProducts = // add products from the last 10 iterations to total in some way
}
private async Task<ProductList> GetProductsAsync(string category, int pageNumber, int productAmount)
{
return await Task.Run(() => MyApi.GetProducts(category, pageNumber, productAmount))
}
어떻게해야합니까? 나는 세 가지 다른 버전을 시도했지만 그들은 모두 오류 또는 아무것도 안하고 결국 ... 아무것도. 그러나 이것이 완전히 잘못되었다는 것을 알고 있습니다 ... 예를 들어 await
을 GetProductsAsync
방법으로 실행하고 있습니다. 정확하게 이해한다면 Task t = Task.WhenAll(tasks.ToArray())
라인의 목적을 망칠 수 있습니다. 그러나 모든 것을 제거하는 유일한 방법이었습니다. ProductList
유형을 System.Action
으로 변환 할 수 없다는 오류 메시지가 표시됩니다.
'GetProductsAsync (category, i, 200)'결과로 아무 것도하지 않는 것 같습니다. – Igor
'Parallel.ForEach'에 대한 작업과 같으며, 선택적으로 커스텀 파티셔너가 있습니다. 'async'는 (주로) 병렬 처리가 아닌 비동기를위한 것이며, 작동 시키더라도 비동기식 오버랩 (async-over-sync) 래퍼로 아주 좋은 시간을 갖지 못합니다. –
@Fildor 죄송합니다. 코드를 복사 할 때 잘못 작성되었습니다. 고쳤다. @Jeroen Mostert 음 ... 나는 그들이 똑같은 생각이라고 생각하고 있었습니까? 확실히 Parallel.ForEach를 살펴볼 것입니다! – daveudou88