2016-08-26 44 views
-1

如果我做一個CancellationTokenSource並把它傳遞到一個地方,我進行這樣的查詢:這是否會取消ExecuteReaderAsync

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

如果立即低於這個我添加以下內容:

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

如果在不同的線程上調用_cancellationTokenSource.Cancel(),查詢是否會被正確取消?

+0

你爲什麼不檢查自己?不知道我明白這個問題的重點。 – 3615

+0

我試過了,它不會取消,直到數據表加載完成。另一個過程是輪詢取消請求,最終目標是嘗試並取消可能長時間運行的查詢。 – endyourif

+0

啊,所以真正的問題是:爲什麼ThrowIfCancellationRequested不會中斷當前的方法執行? – 3615

回答

0

能夠找到一個體面的解決方案的問題。由於取消標記和一個SqlCommand,包裹裝載到數據表作爲成功如下取消DB查詢:

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

所以當的CancellationToken在不同的線程被取消,cmd.Cancel被自動調用。這將拋出一個SqlException,我必須處理並執行清理。