2012-10-30 2 views
3

다음 코드를 가지고 있는데, 이것이 올바른 방법인지 확인해야합니다. 작동하며 모든 것이 있지만 예상대로 빠르지는 않습니다. 각 개별 호출과 가장 오래 걸리는 곳은 실행하는 데 걸리는 시간과 거의 같습니다.언제 모두 작업을 사용해야합니까?

public async Task<Result[]> DoSomethingGoodAsync() 
{ 
    List<Product> productList = getproducts(); 

    IEnumerable<Task<Result>> list = 
     from p in productList select DoSomethingAsync(p); 

    Task<Result>[] slist = list.ToArray(); 

    return await Task.WhenAll(slist); 
} 

지금 내 질문이 맞습니까? 이 작업을 더 효율적이고 효과적으로 수행 할 수있는 방법이 있습니까? DoSomethingAsync는 또 다른 비동기 메서드를 호출하는 대기 가능한 메서드입니다.

편집 : 내 질문 .. 내가 함께 실행하고 싶어하는 메서드의 컬렉션을 구축하는 올바른 방법이 있나요?

내부 DoSomethingAysnc()

scrapeResult = await UrlScraper.ScrapeAsync(product.ProductUrl); 

    model = this.ProcessCheckStock(model, scrapeResult, product); 
+2

getproducts() 호출로 시간이 많이 걸리지 않았습니까? 처음에는? –

+0

'getproducts'는 어떻게 생겼습니까? – casperOne

답변

1

getproductsIList<T>에 할당 유형을 반환 나타납니다. 즉 getproducts에서 반환 된 각 항목에 DoSomethingAsync을 호출하기 전에 getproducts이 결과 집합을 구체화한다는 의미입니다.

각 항목을 산출하는 데 걸리는 시간과 구체화하는 데 걸리는 시간에 따라 가장 큰 영향을 줄 가능성이 많습니다.

그렇다면 메서드를 변경하여 IEnumerable<T> 구현을 반환해야한다고 말했습니다. 하지만 반환 유형을 변경하는 것 이상의 작업을 수행해야하는 경우 구체화를 제거하고 (ToList에 대한 호출 가능성이 높음) 대신 yield을 사용해야합니다.

+0

GetProducts가 수행하는 모든 작업은 DB로 이동하여 최대 5 개 제품을 가져 와서이 항목과 항상 매우 빠른 호출을 보았습니다 – Steoates

+0

@Steoates 그러면 DoSomethingAsync가하는 일은 무엇입니까? – casperOne

+0

DoSomethingAsync는 기본적으로 언젠가는 취할 수있는 처리의 abit를하는 다만 URL 긁는 다! 그러므로 비동기식/기다림 식 작업 시도가이 속도를 높이기 위해 시도되었습니다. – Steoates