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");
}
내가 misparsing 해요,하지만 당신은 너무 낮은 병렬화있는 것처럼 보인다 - (I 코드를 이해 해요 경우) 당신이 원하는 것 수행 (아마도 직렬) myLongSearchQuery 작업 후 AsParallel을 시도하기 때문에 getSearchResults 메소드 내에서 수행하는 대신 X 다른 getSearchResults 호출을 병렬로 실행하기 위해 호출 코드에서 병렬 처리를 수행합니다. –
체인에서 병렬 처리를 이동했습니다. 긴 검색어는 아직 취소되지 않고 있습니다. 이 개념적으로 작동하면 안됩니까? –
현재 실행중인 스레드가 종료 될 수 있도록 취소하면 취소하면 시작중인 새 스레드 만 중지됩니다. – CityView