0

CancellationTokenSource を作成し、次のようなクエリを実行する場所に渡すと:

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

このすぐ下にある場合は、次を追加します。

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

別のスレッドで _cancellationTokenSource.Cancel() が呼び出された場合、クエリは適切にキャンセルされますか?

4

1 に答える 1

2

問題に対するまともな解決策を見つけることができました。キャンセル トークンと SQLCommand を指定すると、次のようにデータ テーブルへの読み込みをラップすると、db クエリが正常にキャンセルされます。

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

したがって、別のスレッドで cancelToken が取り消されると、cmd.Cancel が自動的に呼び出されます。これにより、処理してクリーンアップを実行する必要があった SqlException がスローされます。

于 2016-08-29T12:51:51.060 に答える