我在.NET 3.5应用程序中使用SqlDependency已有3年以上,没有任何问题。场景如下:
最近,我已将系统升级到.NET 4.5,并开始看到将更改放入我们正在监视的表中的问题,但是SqlDependency永远不会触发(在服务和用户应用程序中)。我开始进一步研究,并在日志中注意到,有时我会重新注册SqlDependency,但此后该通知将永远不会触发。
看到此行为后,我决定在SQL Server上运行探查器以捕获订阅事件。从捕获的数据中,我注意到有时一个用户会注册一个订阅(具有唯一的ID),但是另一位用户会激发它(具有相同的唯一ID)。这通常发生在我上面提到的服务以及WPF应用程序的一个或多个用户中。 (我已在事件探查器结果中附加了该问题的屏幕截图)
这是预期的行为吗?是否可以向不同于其注册用户的用户触发通知?这是否指向应用程序层中的问题?任何帮助表示赞赏。
最佳答案
由于正在创建多个SqlDependency实例,因此我将检查是否存在重复订阅,如here所述。根据您的配置,订阅可能被视为重复项。行为“意味着如果请求相同查询的通知,则仅发送一个通知。”
还要检查的另一件事是OnChange事件是否实际上可以正常工作,但由于它在另一个线程上触发而没有出现。 SqlDependency的多线程性质记为here。
探查器跟踪表明Service Broker正在完成其工作。在.NET层中添加其他跟踪将显示订阅是否在数据库级别触发,但不会导致OnChange事件触发。其他疑难解答提示可以在here中找到。
关于c# - 随着时间的流逝,SqlDependency丢失订阅,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19687283/