2014-11-10 4 views
3

이 같은 종류의 보이는 루틴 (간체)을 최적화하기 위해 노력하고있어이 포함 된 경우 GetBaz()은 0과 많은 항목을 반환합니다. 우리는 몇 백만 개의 ID를 처리 했으므로 처음에는 응용 프로그램 속도를 높이기위한 초기 시도로 if(bars.Any()) 문을 추가했습니다.점검 수율 반환 항목

GetBars()이 기다리기 때문에 모든 데이터를 수집 할 때까지 스레드가 차단됩니다 (시간이 다소 걸릴 수 있음). 내 생각은 yield return을 사용하고 if(bars.Any())을 하나 이상의 요소가 있는지 검사하는 검사로 바꿔서 그 동안 다른 두 개의 비동기 메서드를 실행 취소 할 수 있습니다 (실행에 약간의 시간이 소요됨).

내 질문에 다음 어떻게합니까. 나는 System.Linq.Count()System.Linq.Any()이 yield yield의 전체적인 아이디어를 무효로하고, enumerable의 첫 번째 항목을 체크하면 열거 가능 값에서 제거된다는 것을 알고있다.

예를 들어 out 매개 변수를 GetBars()에 추가하는 것 외에 다른/더 나은 옵션이 있습니까? 012 : 출력 : 수익률 반환 값의 열거 형이 반복을 시작하지 않고 개체를 포함하고 있는지 확인하려면 어떻게합니까? 실제 질문에 대한

+0

잘못된 인상을 주었다면 수정하십시오. GetBars()에 첫 번째 요소를 검사하는 요소가 있는지 여부를 알 수있는 방법을 찾으려고합니다. 권리? –

+0

@mot 맞습니다. 원래 질문에 추가하겠습니다. – Asser

+0

''await client.GetFoos'는'GetBars' 메소드의 가장 긴 부분입니까? – Rawling

답변

4

"어떻게 항복 반환에서 열거 여부를 확인합니까 그것을 반복 시작하지 않고 모든 개체를 포함?" 글쎄, 그렇지 않아.

IEnumerable을 사용하여 수행 할 수있는 유일한 작업은 순조로운 일이므로 기간을 정할 수 없습니다. 열거하기에 좋습니다. Any()를 호출하는 것은 문제가 아니지만 "않습니다"는 첫 번째 요소 만 열거하지만 (전체 목록은 아님) 많은 열거 형이 존재하지 않으므로 아무 것도 열거 할 수 없습니다. 파이프 라인 (백킹 콜렉션이 없을 수도 있습니다. 아직 존재하지 않는 것이 어떤 요소를 가지고 있는지 확인하는 것은 불가능합니다. 디자인 상으로는 의미가 없습니다.)

편집 : 또한 귀하의 수율이 보이지 않습니다. 코드, 당신은 기다릴 수있는 것과 득실 거리는 개념 (완전히 무관)을 혼합하고 있습니까?

+0

괜찮습니다. 꽤 똑바로 전합니다 고마워요. 편집 : 이것은 최적화 전에 코드가 어떻게 보이는지입니다. – Asser