也许这是一个多次被问到的问题,但经过大量的搜索和阅读后,我仍然不太确定什么是最好的方法。
问题很简单:我的应用程序中的某些数据库事务很长(秒,分钟)。这可能是两件事的结果:要求单个查询处理大量数据,或者对一系列检索到的数据执行多个查询。在许多情况下,这两件事都在发挥作用。这会挂起用户界面,更糟糕的是他无法取消这个。
解决方案似乎也很简单:将这些事务移动到另一个线程中,然后在需要时销毁此线程。
然而,互联网上有很多人反对杀死线程。他们建议使用DbCommand.Cancel()这是一个线程安全的操作。但是,其他人说,不能保证该命令将取消查询。提出了更大的问题:当用户点击时,UI线程如何知道正在执行哪个DbCommand?哎呀,线程可以在那一刻处理内存中的数据。
你能否阐明这个问题?
答案 0 :(得分:2)
无法保证该命令会取消查询
这取决于提供商。某些提供程序不支持取消命令,但SQL Server支持,因此它不应该是一个问题。当然它还取决于正在执行的命令类型......
提出了更大的问题:当用户点击时,UI线程如何知道哪个DbCommand正在执行?
DbCommand.Cancel
是一个实例方法,而不是静态方法...所以你需要保持对正在执行的命令的引用,并在这个实例上调用cancel。