【问题标题】:Cancelling a database query dillema取消数据库查询困境
【发布时间】:2011-07-25 09:30:45
【问题描述】:

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

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

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

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

你能解释一下这个问题吗?

【问题讨论】:

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


    【解决方案1】:

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

    这取决于提供者。一些提供程序不支持取消命令,但 SQL Server 支持,所以这应该不是问题。当然这也取决于正在执行的命令的种类...

    出现了更大的问题:UI 线程如何知道用户点击时执行的是哪个 DbCommand?

    DbCommand.Cancel 是一个实例方法,而不是静态方法...所以您需要保留对正在执行的命令的引用,并在此实例上调用取消。

    【讨论】:

    • 保持引用并不是一件容易实现的事情。它需要仔细同步并在代码中引入锁。至少,这是我的理解。
    • 你确定我们说的是同一件事吗?保留引用只是将 DbCommand 存储在变量或字段中的问题......我不明白这怎么会是一个问题。
    • 工作线程可能在给定时刻执行大量查询,这意味着它会不断更新引用。 UI 线程可以获得对已释放命令的引用。
    • 当然……但无论如何,如果你想取消一个命令,那是没有办法的:你必须知道你想取消哪个命令
    猜你喜欢
    • 2017-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-19
    • 1970-01-01
    相关资源
    最近更新 更多