2014-01-29 50 views
1

我有一个应用程序利用SqlDependency对象来跟踪基础数据库中某些数据表上的更改。正常停止SqlDependency

对于他们的工作以及在大多数情况下,然而,我注意到,当我尝试使用类的静态Stop()方法杀死的依赖,我得到以下异常:

A severe error occurred on the current command. The results, if any, should be discarded. Operation cancelled by user.

这是对所有的信息运行时提供。在数据库端日志充斥着重复的错误类型:

The query notification dialog on conversation handle '{59CC17D7-DB61-E311-BF57-00151796FDC4}.' closed due to the following error: 8490 Cannot find the remote service 'SqlQueryNotificationService-058a0d35-359a-478e-b227-427d7dabc62c' because it does not exist.

据推测,这是应用程序的结果不正确终止的依赖,并留下通知服务僵尸条目。它似乎没有造成任何不利影响,但对于没有正确终止的每一个客户端来说,日志都会充斥着这些通知错误......更不用说这只是不好的做法。

这是怎么发生的?我认为通过调用Stop(),所有现有的处理来改变事件将被释放。如果情况并非如此,您将如何优雅地释放所有打开的句柄?我不能明确地释放它们,因为对数据的查询是由应用程序动态驱动的;在任何时候我都不知道用户决定采取什么措施。只有他们查询的内容受到依赖关系的约束。

回答

3

不,没有任何办法正确关机SqlDependency。为每个应用程序使用即时部署的队列和服务的设计选择实例订阅query notifications使其易于使用,但会产生一些负面影响,并且当您的错误日志中弹出这些错误消息时您会看到它们。大多数时候这些错误信息都可以安全地忽略,但它们是may have some negative consequences

勇敢的人可以控制自己的命运,并使用更基本的SqlNotification,请参阅Using SqlNotificationRequest to Subscribe to Query Notifications。这个班级不会尝试以您的名义部署服务和排队,它期望您执行“肮脏的工作”。好处是你有控制权并且可以避免困扰SqlDependencyStart()/Stop()(启动权限,不适当的关闭命令等​​)的问题。

+0

感谢Remus。我很惊讶,在我对这个问题的研究过程中,我没有打你的博客,描述得非常好。 –