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