【问题标题】:Will this cancel an ExecuteReaderAsync这会取消 ExecuteReaderAsync
【发布时间】:2016-08-26 12:41:36
【问题描述】:

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

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

如果在此下方,我添加以下内容:

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

如果在不同的线程上调用 _cancellationTokenSource.Cancel(),查询会被适当地取消吗?

【问题讨论】:

  • 你为什么不检查一下自己?不确定我是否理解这个问题的意义。
  • 我试过了,直到加载数据表后才取消。另一个进程正在轮询取消请求,最终目标是尝试取消可能长时间运行的查询。
  • 啊,所以真正的问题是:为什么 ThrowIfCancellationRequested 不会中断当前方法的执行?
  • 也许,我仍然觉得我误解了为什么如果我将取消令牌传递给 ExecuteReaderAsync 它不会在内部检测到它已被取消。
  • 在你的小提琴中,问题发生是因为计时器对象在被实际调用之前被释放,所以 ts.Cancel() 永远不会被调用。如果您将通过worker.Do(ts).Wait(); 阻止线程并防止在执行 Do 方法之前收集计时器,那么一切都应该像以前一样工作。

标签: c# executereader


【解决方案1】:

能够找到解决问题的好方法。给定取消令牌和 SQLCommand,将加载包装到数据表中,如下所示成功取消 db 查询:

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

所以当 cancelToken 在不同的线程中被取消时,cmd.Cancel 会被自动调用。这将引发我必须处理并执行清理的 SqlException。

【讨论】:

  • 你真的不得不佩服那些人的喜剧感。要么就是这样,要么他们被扔在头上。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-04
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 2013-08-19
相关资源
最近更新 更多