我在.NET 3.5应用程序中使用SqlDependency已有3年以上,没有任何问题。场景如下:

  • 使用SqlDependency监视表的中央Windows服务(我们将此表称为A表)
  • 使用WPF应用程序的多个用户,每个用户观看一个表(又是表A)具有唯一的SqlDependency
  • 用户将工作单元排队在表A中进行处理
  • SqlDependency在Windows服务
  • 上触发
  • Windows服务处理表A中所有未完成的项目,并将结果保存到表A中。
  • 每个结果可用的用户的唯一SqlDependency激发
  • 用户处理他们的工作

  • 最近,我已将系统升级到.NET 4.5,并开始看到将更改放入我们正在监视的表中的问题,但是SqlDependency永远不会触发(在服务和用户应用程序中)。我开始进一步研究,并在日志中注意到,有时我会重新注册SqlDependency,但此后该通知将永远不会触发。

    看到此行为后,我决定在SQL Server上运行探查器以捕获订阅事件。从捕获的数据中,我注意到有时一个用户会注册一个订阅(具有唯一的ID),但是另一位用户会激发它(具有相同的唯一ID)。这通常发生在我上面提到的服务以及WPF应用程序的一个或多个用户中。 (我已在事件探查器结果中附加了该问题的屏幕截图)

    这是预期的行为吗?是否可以向不同于其注册用户的用户触发通知?这是否指向应用程序层中的问题?任何帮助表示赞赏。

    c# - 随着时间的流逝,SqlDependency丢失订阅-LMLPHP

    最佳答案

    由于正在创建多个SqlDependency实例,因此我将检查是否存在重复订阅,如here所述。根据您的配置,订阅可能被视为重复项。行为“意味着如果请求相同查询的通知,则仅发送一个通知。”

    还要检查的另一件事是OnChange事件是否实际上可以正常工作,但由于它在另一个线程上触发而没有出现。 SqlDependency的多线程性质记为here

    探查器跟踪表明Service Broker正在完成其工作。在.NET层中添加其他跟踪将显示订阅是否在数据库级别触发,但不会导致OnChange事件触发。其他疑难解答提示可以在here中找到。

    关于c# - 随着时间的流逝,SqlDependency丢失订阅,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19687283/

    10-10 15:08