2017-04-19 15 views
0

내 qestion은 PLINQ와 yield 키워드를 조합 한 결과입니다. 내가 이렇게 쓰면 어떻게 될까?Collection.AsParallel() + yield returns

//Some stuff here 
foreach (var x in collection.AsParallel()) 
{ 
    yield return new CustomObject 
    { 
     property1 = //Large calculations here 
     property2 = x.Name 
     //... etc. 
    }; 
} 

내가 원하는 것은 무엇인가? 다른 스레드에서 객체를 초기화하고 싶지만 객체가 필요할 때 반환하려고합니다.
미리 감사드립니다.

+0

아니요. 내 경우에는 모든 것이 작동하지만 qestion은 '어떻게'입니까? – user3818229

답변

3

AsParallel은 LINQ 연산의 병렬 버전을 사용할 수 있습니다. 실제로는 을 수행하지 않습니다. 그 자체는 무엇이든합니다.

약간의 추가 오버 헤드가없는 코드는 기능적으로 전혀 AsParallel을 생략하지 않은 것과 다릅니다.

실제로 병렬로 CustomObject 인스턴스를 구성 할 수 있고 PLINQ를 사용하려는 경우 (병렬로 개체를 만드는 데 사용할 수있는 다른 여러 도구가 있음) 그런 다음 Select을 사용하여 고유 한 사용자 정의 반복자 블록을 사용하지 않고 한 유형의 시퀀스를 다른 유형의 시퀀스로 변환 할 수 있습니다.

+0

설명해 주셔서 감사합니다.이 라이브러리에 연결된 질문을하겠습니다. 이렇게하면 : .AsParallel(). Select (x => {var t = _db.//db 컨텍스트를 사용하는 일부 작업; 새로운 반환 ...}) 연결에 문제가 있습니까? "두 번째 스레드는 동일한 컨텍스트에서 첫 번째 닫기 실행 전에 작업을 시작합니다"라는 의미입니까? – user3818229

+0

@ user3818229 모든 db 공급자가이를 지원하지만 물론 공급자에 따라 다릅니다. – Servy