2010-07-19 6 views
2

NET 4.0 병렬 작업 라이브러리를 사용하여 여러 FTS 쿼리를 처리하려고합니다. 쿼리에 너무 많은 시간이 걸리면이를 취소하고 나머지는 처리하면서 계속 진행하고 싶습니다.PLINQ에서 장기 실행 작업 취소

하나의 쿼리가 임계 값을 초과하면이 코드가 중지되지 않습니다. 나는 취소 작업과 시간 제한이 단일 트랜잭션이 아닌 전체 프로세스에 대해 이루어 지도록 호출하고 있다고 생각합니다. 시간 간격을 매우 작게 설정하면 (300ms) 모든 검색 문자열이 호출됩니다.

나는 어떤 명백한 것을 놓치고 있다고 생각합니다. 어떤 통찰력이라도 미리 감사드립니다.

또한 여전히 매우 긴 쿼리가 실행되지 않는 것으로 보입니다. 장기 실행 쿼리가 트리거되면이를 취소하는 올바른 방법일까요?

코드 수정 :

CancellationTokenSource cts = new CancellationTokenSource(); 
CancellationToken token = cts.Token; 

var query = searchString.Values.Select(c =>myLongQuery(c)).AsParallel().AsOrdered() 
             .Skip(counter * numToProcess).Take(numToProcess).WithCancellation(cts.Token); 

    new Thread(() => 
    { 
    Thread.Sleep(5000); 
    cts.Cancel(); 
    }).Start(); 

    try 
    { 
    List<List<Threads>> results = query.ToList(); 
    foreach (List<Threads> threads in results) 
    { 
      // does something with data 
    } 
    } catch (OperationCanceledException) { 
    Console.WriteLine("query took too long"); 
    } 
+0

내가 misparsing 해요,하지만 당신은 너무 낮은 병렬화있는 것처럼 보인다 - (I 코드를 이해 해요 경우) 당신이 원하는 것 수행 (아마도 직렬) myLongSearchQuery 작업 후 AsParallel을 시도하기 때문에 getSearchResults 메소드 내에서 수행하는 대신 X 다른 getSearchResults 호출을 병렬로 실행하기 위해 호출 코드에서 병렬 처리를 수행합니다. –

+0

체인에서 병렬 처리를 이동했습니다. 긴 검색어는 아직 취소되지 않고 있습니다. 이 개념적으로 작동하면 안됩니까? –

+0

현재 실행중인 스레드가 종료 될 수 있도록 취소하면 취소하면 시작중인 새 스레드 만 중지됩니다. – CityView

답변

0

이 그냥 추측 : (정상 LINQ에서와 같이) 쿼리가 지연이라는 문제가되지 않습니다 그래서 그것이 나중에 때까지 실행되지 않습니다?

+0

나는 당신이 의미하는 것을 이해하는지 모르겠다 .. 결과가 입력되지 않았기 때문에? 명확히 해 주시겠습니까? –

+0

'var results = ...'줄은 실제로 쿼리를 실행하지 않을 것이라고 생각합니다. 실제로 결과를 열거 할 때만 실행됩니다. – svick

1

PLINQ는 몇 가지 요소 수마다 취소 토큰을 폴링합니다. 검사 빈도가 응용 프로그램에 충분하지 않은 경우 PLINQ 쿼리의 값 비싼 대리자가 정기적으로 cts.Token.ThrowIfCancellationRequested()를 호출하는지 확인하십시오. 자세한 내용은

,이 문서를 참조하십시오 어쩌면 http://blogs.msdn.com/b/pfxteam/archive/2009/06/22/9791840.aspx

관련 문제