42

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

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

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

看到这种行为后,我决定在 SQL Server 上运行分析器来捕获订阅事件。从捕获的数据中,我注意到有时订阅会由一个用户注册(使用唯一 ID),但随后会被另一个用户触发(使用相同的唯一 ID)。这通常发生在我上面提到的服务和 WPF 应用程序的一个或多个用户身上。(我在分析器结果中附上了问题的屏幕截图)

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

探查器结果

4

1 回答 1

4

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

要检查的另一件事是 OnChange 事件是否真的可以工作,但由于它在不同的线程上触发而不会出现。SqlDependency 的多线程特性在此处进行了说明。

Profiler 跟踪表明 Service Broker 正在执行其工作。在 .NET 层中添加额外的跟踪将显示订阅是否在数据库级别触发,但不会导致 OnChange 事件触发。可以在此处找到其他故障排除提示。

于 2016-03-05T03:52:09.713 回答