1

我知道 TPL 中的 CancellationToken 支持,但是(IMO)只有在我有适当的 token.ThrowifCancellationRequested() 时才能工作,这在我的场景中是不可能的。

有没有其他优雅的方式(除了完全中止线程)来实现这一点?

我不关心线程的事务状态。我不在乎线程停止/取消的状态。

感谢您的关注!

更多细节:我需要生成一个新线程(任务/线程池/线程)来调用一个 API,该 API 调用多个存储过程来获取近 100 万条记录,然后对每条记录进行一些修饰(业务计算)。最后,此 API 返回一个数据表,该数据表是一份业务重要报告。如果需要,我想为用户提供中途取消此处理的选项。例如,如果设置了错误的过滤器集。API只做只读操作,所以不需要事务管理。

4

1 回答 1

0

要正确执行此操作,您应该通过取消令牌在 Task 类中使用内置方法,或使用取消后台工作程序。或者,您可以尝试使用volatilebool 来检查用户请求是否已被取消。但是,volatile布尔在不同架构(单/多处理器)中的行为不一致。或者,您可以使用*ResetEvents 来指示调用了取消。这一切都需要在 API 本身中完成,否则它如何知道何时检查取消条件?您将无法优雅地取消它。

当然,永远不要调用Abort线程——这是邪恶的,可能会使整个应用程序处于未定义状态,除非您打算重新启动整个应用程序,否则不要调用它。

奖金建议

还要考虑在数据库端做所有的处理工作。不要将非常少量的记录带到客户端,比如说 1k 是一个很好的实用阈值。考虑这样一种情况,许多用户请求不同的报告,这些报告都加载了服务器那么多 - 这不能很好地扩展。此外,服务器在数据处理方面非常高效,并且它们身边有数据 - 已经完成了大量优化(CPU 线路缓存、快速内存访问等)。

于 2012-10-29T07:37:28.797 回答