这会取消ExecuteReaderAsync吗?

时间:2016-08-26 12:41:36

标签: c# executereader

如果我创建一个CancellationTokenSource并将其传递到我执行这样的查询的地方:

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

如果紧接在此之下,我添加以下内容:

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

如果在另一个线程上调用了_cancellationTokenSource.Cancel(),那么查询会被适当取消吗?

1 个答案:

答案 0 :(得分:0)

能够找到解决问题的合适方案。给定取消令牌和SQLCommand,将加载包装到数据表中成功取消db查询:

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

因此,当在另一个线程中取消了cancellationToken时,会自动调用cmd.Cancel。这将抛出我必须处理并执行清理的SqlException。