2016-08-26 5 views
-1

을 취소합니다나는 CancellationTokenSource을하고 나는이 같은 쿼리를 수행 할 경우 장소에 그것을 아래로 전달하는 경우이 ExecuteReaderAsync

_cancellationToken.ThrowIfCancellationRequested(); 
resultTable.Load(dataReader); 
:

await command.Connection.OpenAsync(); 
dataReader = await command.ExecuteReaderAsync(_cancellationToken); 

을 즉시 아래 나는 다음과 같은 추가하는 경우

다른 스레드에서 _cancellationTokenSource.Cancel()이 호출되면 쿼리가 적절하게 취소됩니까?

+0

직접 확인하지 않으시겠습니까? 이 질문에 대한 요지를 잘 모르겠다. – 3615

+0

시도했는데, 데이터 테이블이로드 될 때까지 취소되지 않습니다. 또 다른 프로세스는 취소 요청을 폴링하고 최종 목표는 잠재적으로 장기 실행 쿼리를 시도하고 취소하는 것입니다. – endyourif

+0

아, 그럼 진짜 질문입니다 : ThrowIfCancellationRequested가 현재 메소드 실행을 방해하지 않는 이유는 무엇입니까? – 3615

답변

0

문제에 대한 적절한 해결책을 찾을 수있었습니다. cancellationToken가 다른 스레드에서 취소 될 때

using (CancellationTokenRegistration ctr = cancellationToken.Register(() => cmd.Cancel())) 
{ 
    using (var reader = cmd.ExecuteReaderAsync(cancellationToken)) 
    { 
     dataTable.Load(reader.Result); 
    } 
} 

는 그래서, cmd.Cancel가 자동으로 호출되어 성공적으로 다음에 DB 쿼리를 취소 같은 데이터 테이블에로드를 포장, 취소 토큰과 SqlCommand를 주어진. 이렇게하면 SqlException이 throw되어 정리 작업을 수행해야합니다.