2011-10-21 5 views
1

개체에 linq를 사용하고 .ToList 및 .ToArray 작업이 스레드를 차단하고 있음을 알았습니다. (성능 보고서에서 차단 된 시간을 봅니다.) GC가 tolist 또는 toarray를 호출 할 때 메모리를 할당하려고하기 때문입니다. 병렬 루프에서 linq을 사용하고 있으며 linq의 공유 콜렉션에 액세스하려고하기 때문에 이것은 나쁘다. 이 문제를 해결할 수있는 방법이 있나요?linq 개체 스레드를 차단할 것인가?

+1

당신이하고있는 것에 대한 구체적이고 구체적인 예가 있습니까? 특히 스레드를 사용하여 세부 사항을 이해하는 것이 중요합니다. –

+0

또한 : 데이터가 얼마나 큰가 –

+0

'병렬 루프에서 linq을 사용하고 있습니다': PLinq를 사용하고 계십니까? – phoog

답변

3

ToList 또는 ToArray을 호출하면 쿼리가 즉시 평가됩니다. 그러면 전체 컬렉션이 평가되고 쿼리 결과가 반환 될 때까지 호출 된 스레드가 차단됩니다.

두 가지 방법 중 하나를 호출하지 않고 직접 쿼리를 반복해야합니다. 결과를 스트리밍합니다 (다른 열정적 인 평가가 없다고 가정).

동시 작업이 필요한 경우 Task Parallel Library (TPL)을 살펴 보시기 바랍니다.

+0

감사합니다. 당신이 제안한대로 반복합니다. 경합 시간은 다음과 같습니다 : -System.Linq.Enumerable.WhereSelectEnumerableIterator'2.MoveNext() - ConsoleApplication3.Module1._Lambda $ __ 7 (클래스 VB $ AnonymousType_0'2 <클래스 ConsoleApplication3.Module1/ClassA, 클래스 ConsoleApplication3. Module1/ClassB>, 클래스 ConsoleApplication3.Module1/ClassC) --- JIT_NewFast (struct CORINFO_CLASS_STRUCT_ *). 어떤 아이디어? – orange

+0

마지막으로 나는 대답을 얻었다. 내가해야 할 유일한 일은 GC를 서버 모드로 바꾸는 것이다. – orange

관련 문제