2011-03-04 3 views
1

PLINQ를 기반으로 백그라운드에서 Linq 쿼리를 실행할 수있는 특별한 기능이 있습니까? 나는 몇 가지 시도를했지만 올바른 접근법을 찾지 못했습니다.백그라운드에서 Linq 쿼리 - PLINQ의 내용

배경 작업자를 만들 수는 있지만 실제로 처리 할 수는없는 "사용할 수있는"항목을 찾고 있습니다.

전체 사진 : 내 WinForm 응용 프로그램이 LINQ를 통해 데이터를 읽지 않고 더 많은 양의 데이터를 읽을 때 "차단"을 방지하도록 노력합니다.

답변

3

Task<T>을 생성하고 PLINQ 쿼리를 래핑하게 할 수 있습니다.

PLINQ는 비동기 작업 (원하는 내용)을 만드는 것이 아니라 단일 (차단) 작업 내에서 동시 처리하는 것입니다. 대신 다음과 같은 작업을 수행하는 것이 좋습니다.

Task<IEnumerable<YourType>> task = Task.Factory.StartNew( 
     () => 
     { 
      // Use standard LINQ here... 
      return myCollection.Where(SomeCriteria); 
     } 
    ); 

// When this is completed, do something with the results 
task.ContinueWith(t => 
{ 
    IEnumerable<YourType> results = t.Result; 

    // Use results here (on UI thread - no invoke required) 

}, TaskScheduler.FromCurrentSynchronizationContext()); 
+0

좋은 예와 모든 세부 정보가 포함 된 좋은 예입니다. 특히 TaskScheduler.FromCurrentSynchronizationContext()는 원래 스레드로 계속 진행되므로 UI를 업데이트 할 때 크로스 스레드 예외가 발생하지 않으므로 (InvokeRequired 처리가 필요하지 않음) 주목할만한 기능입니다. –