C# 如果需要';太';长的

C# 如果需要';太';长的,c#,asp.net,.net,linq,linq-to-sql,C#,Asp.net,.net,Linq,Linq To Sql,目前,我需要创建一个报告程序,在SQL数据库中的许多不同表上运行报告。多个不同的客户端需要此功能,但有些客户端的数据库比其他客户端的数据库大。我想知道的是,如果查询花费的时间太长,是否有可能在一段时间后停止查询 为了提供一些上下文,一些客户机的表的行数超过了200万行,尽管不同的客户机在同一个表中可能只有50k行。我希望能够运行查询20秒,如果查询尚未完成,则返回一条消息给用户,告诉用户结果集太大,需要在小时之外生成报告,因为我们不希望在白天运行资源密集型操作。设置连接的连接超时通过在DataC

目前,我需要创建一个报告程序,在SQL数据库中的许多不同表上运行报告。多个不同的客户端需要此功能,但有些客户端的数据库比其他客户端的数据库大。我想知道的是,如果查询花费的时间太长,是否有可能在一段时间后停止查询


为了提供一些上下文,一些客户机的表的行数超过了200万行,尽管不同的客户机在同一个表中可能只有50k行。我希望能够运行查询20秒,如果查询尚未完成,则返回一条消息给用户,告诉用户结果集太大,需要在小时之外生成报告,因为我们不希望在白天运行资源密集型操作。

设置连接的连接超时通过在
DataContext
上输入或。当超时过期时,您将得到一个
TimeoutException
,您的查询将被取消

您无法确定在超时发生的瞬间服务器上是否取消了查询,但在大多数情况下,查询会很快取消。有关详细信息,请阅读这篇优秀的文章。其中最重要的部分是:

客户端使用注意向服务器发出查询超时信号 事件注意事件只是TDS数据包的一种独特类型 SQL Server客户端可以发送到它。除了连接/断开, 在T-SQL批处理和RPC事件中,客户端可以向 服务器。注意提示服务器取消连接 当前正在尽快执行查询(如果有)。一 注意不会回滚打开的事务,也不会停止 当前正在对一个dime执行查询--服务器中止它所执行的任何操作 在下一个可用的机会进行连接。 通常,这种情况发生得很快,但并不总是如此


但请记住,不同的提供商之间的连接超时时间会有所不同,甚至可能会在不同的服务器版本之间发生变化。

通过设置连接字符串或数据上下文上的连接超时时间。当超时过期时,您将得到一个
TimeoutException
,您的查询将被取消

您无法确定在超时发生的瞬间服务器上是否取消了查询,但在大多数情况下,查询会很快取消。有关详细信息,请阅读这篇优秀的文章。其中最重要的部分是:

客户端使用注意向服务器发出查询超时信号 事件注意事件只是TDS数据包的一种独特类型 SQL Server客户端可以发送到它。除了连接/断开, 在T-SQL批处理和RPC事件中,客户端可以向 服务器。注意提示服务器取消连接 当前正在尽快执行查询(如果有)。一 注意不会回滚打开的事务,也不会停止 当前正在对一个dime执行查询--服务器中止它所执行的任何操作 在下一个可用的机会进行连接。 通常,这种情况发生得很快,但并不总是如此


但是请记住,它会因提供程序而异,甚至可能会因服务器版本的不同而有所变化。

如果在后台线程上运行query,您可以轻松地做到这一点。使主线程启动一个计时器并生成一个运行查询的后台线程。如果20秒过后后台线程没有返回结果,主线程可以取消它

如果在后台线程上运行query,您可以很容易地做到这一点。使主线程启动一个计时器并生成一个运行查询的后台线程。如果20秒过后后台线程没有返回结果,主线程可以取消它

这实际上是取消了查询,还是只是断开了客户端的连接?啊,谁在乎查询,那只是服务器资源。它很可能会在很短的时间内取消查询;请参阅更新的答案。感谢@driis提供您的答案。起初我在考虑类似的事情,但几乎只是想有人澄清一下。看起来它可能比线程更容易处理。这实际上是取消查询,还是只是断开客户端连接?啊,谁在乎查询,那只是服务器资源。它很可能会在很短的时间内取消查询;请参阅更新的答案。感谢@driis提供您的答案。起初我在考虑类似的事情,但几乎只是想有人澄清一下。似乎它比线程更容易处理。只使用内置超时似乎比手动使用线程更容易。问题是线程无法安全地“取消”,尤其是在I/O中被占用时。只使用内置超时似乎更容易,问题是线程不能被安全地“取消”,特别是在I/O中绑定时。