取消数据库查询困境

时间:2011-07-25 09:30:46

标签: .net sql-server database ado.net

也许这是一个多次被问到的问题,但经过大量的搜索和阅读后,我仍然不太确定什么是最好的方法。

问题很简单:我的应用程序中的某些数据库事务很长(秒,分钟)。这可能是两件事的结果:要求单个查询处理大量数据,或者对一系列检索到的数据执行多个查询。在许多情况下,这两件事都在发挥作用。这会挂起用户界面,更糟糕的是他无法取消这个。

解决方案似乎也很简单:将这些事务移动到另一个线程中,然后在需要时销毁此线程。

然而,互联网上有很多人反对杀死线程。他们建议使用DbCommand.Cancel()这是一个线程安全的操作。但是,其他人说,不能保证该命令将取消查询。提出了更大的问题:当用户点击时,UI线程如何知道正在执行哪个DbCommand?哎呀,线程可以在那一刻处理内存中的数据。

你能否阐明这个问题?

1 个答案:

答案 0 :(得分:2)

  

无法保证该命令会取消查询

这取决于提供商。某些提供程序不支持取消命令,但SQL Server支持,因此它不应该是一个问题。当然它还取决于正在执行的命令类型......

  

提出了更大的问题:当用户点击时,UI线程如何知道哪个DbCommand正在执行?

DbCommand.Cancel是一个实例方法,而不是静态方法...所以你需要保持对正在执行的命令的引用,并在这个实例上调用cancel。