如果我创建一个CancellationTokenSource并将其传递到执行如下查询的地方:
await command.Connection.OpenAsync();
dataReader = await command.ExecuteReaderAsync(_cancellationToken);
如果紧接在下面,我添加以下内容:
_cancellationToken.ThrowIfCancellationRequested();
resultTable.Load(dataReader);
如果在另一个线程上调用_cancellationTokenSource.Cancel(),查询会被适当地取消吗?
能够找到一个体面的解决方案。给定取消令牌和SQLCommand,将加载包装到数据表中,如下所示成功地取消了db查询:
using (CancellationTokenRegistration ctr = cancellationToken.Register(() => cmd.Cancel()))
{
using (var reader = cmd.ExecuteReaderAsync(cancellationToken))
{
dataTable.Load(reader.Result);
}
}
所以当cancellationToken在另一个线程中被取消时,cmd。自动调用Cancel。这将抛出一个我必须处理并执行清理的SqlException。