我知道TPL中的CancellationToken支持,但是(IMO)只有在我有适当的token.ThrowifCancellationRequested()时才能工作,这在我的场景中是不可能的。
有没有其他优雅的方法(除了完全中止线程)来实现这个目标?
我不关心线程的事务状态。 我不关心线程被停止/取消的状态。
感谢您的关注!
更多详情: 我需要生成一个新线程(Task / Threadpool / Thread)来调用一个API,它调用多个存储过程来获取接近1百万条记录,然后对每条记录进行一些修饰(业务计算)。 最后,此API返回一个数据表,这是一个业务重要报告。 如果需要,我想让用户选择在中途取消此处理。例如,如果设置了错误的过滤器集。 API only 只执行只读操作,因此不需要事务管理。
答案 0 :(得分:0)
要正确执行此操作,您应该通过取消令牌在Task类中使用构建方法,或者使用取消后台工作程序。或者,您可以尝试使用volatile
bool来检查用户请求是否已被取消。但是,volatile
bools在不同架构(单/多处理器)上的表现并不一致。或者,您可以使用*ResetEvent
来指示已取消取消。这一切都需要在API本身完成,否则它将如何知道何时检查取消条件?你不能优雅地取消它。
当然,不要在线程上调用Abort
- 这可能会使整个应用程序处于未定义状态,除非您打算重新启动整个应用程序,不要打电话它
还要考虑在数据库端进行所有处理工作。不要向客户端带来超过少量的记录,比如1k是一个很好的实用门槛。考虑这样一种情况:许多用户请求不同的报告,这些报告都加载 的服务器< - >这不会很好地扩展。此外,服务器在数据处理方面非常高效,并且他们在他们的数据库中进行了大量的优化(CPU线路缓存,快速内存访问等)。