SqlDependency丢失订阅随着时间的推移

我一直在.NET 3.5应用程序中使用SqlDependency超过3年没有任何问题。 情况如下:

  1. 用SqlDependency观察一个表的中央窗口服务(让我们称之为表A)
  2. 多个用户使用WPF应用程序和每个用户观看一个表的唯一SqlDependency (表A再次)
  3. 用户在表A中排队处理一个工作单元
  4. SqlDependency触发Windows服务
  5. Windows服务处理表A中的所有未完成项目,并将结果保存到表A中
  6. 唯一的SqlDependency触发结果可用的每个用户
  7. 用户处理他们的工作

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

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

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

分析器结果

由于正在创build多个SqlDependency实例,因此我将检查重复订阅,如此处所述。 根据您的configuration,订阅可能被认为是重复的。 该行为“意味着如果为相同查询请求通知,则只发送一个通知。”

另一件要检查的事情是OnChange事件是否可以实际工作,但不会出现,因为它在不同的线程上触发。 这里logging了SqlDependency的multithreading性质。

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