[英]Halt Linq query if it will take 'too' long
当前,我需要创建一个报告程序,该程序可以在SQL数据库中的许多不同表上运行报告。 多个不同的客户端需要此功能,但是某些客户端具有比其他客户端更大的数据库。 我想知道的是,如果花费了太长时间,是否可以在一段时间后停止查询。
为了提供一些上下文,一些客户端的表超过200万行,尽管不同的客户端在同一表中可能只有5万行。 我希望能够运行查询20秒钟,如果还没有完成查询,则向用户返回一条消息,说结果集将太大,并且需要像我们一样在几小时之外生成报告不想在白天运行资源密集型操作。
通过CommandTimeout
属性在连接字符串或DataContext
上设置连接超时。 超时到期时,您将收到TimeoutException
,并且查询将被取消。
您无法确定在发生超时的那一刻服务器上就会取消查询,但是在大多数情况下,查询会很快取消。 有关详细信息,请阅读出色的文章“没有查询超时...” 。 重要的部分是:
客户端使用注意事件向服务器发出查询超时信号。 注意事件只是SQL Server客户端可以发送给它的TDS数据包的一种不同类型。 除了连接/断开连接,T-SQL批处理和RPC事件外,客户端还可以向服务器发出注意信号。 注意告诉服务器尽快取消连接的当前正在执行的查询(如果存在)。 注意不会回滚打开的事务,也不会停止对一角钱的当前正在执行的查询-服务器在下一个可用机会中止为连接所做的任何操作。 通常,这种情况很快发生,但并非总是如此。
但是请记住,它在提供程序之间会有所不同,甚至可能会在服务器版本之间发生变化。
如果在后台线程上运行查询器,则可以轻松地做到这一点。 使主线程启动计时器,并生成运行查询的后台线程。 如果20秒过后,后台线程没有返回结果,则主线程可以将其取消。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.