SqlDependency丢失订阅随着时间的推移
我一直在.NET 3.5应用程序中使用SqlDependency超过3年没有任何问题。 情况如下:
- 用SqlDependency观察一个表的中央窗口服务(让我们称之为表A)
- 多个用户使用WPF应用程序和每个用户观看一个表的唯一SqlDependency (表A再次)
- 用户在表A中排队处理一个工作单元
- SqlDependency触发Windows服务
- Windows服务处理表A中的所有未完成项目,并将结果保存到表A中
- 唯一的SqlDependency触发结果可用的每个用户
- 用户处理他们的工作
最近,我将系统升级到了.NET 4.5,并开始发现将更改放入正在监视的表中的问题,但SqlDependency永远不会触发(在服务和用户应用程序中)。 我开始进一步深入研究,并在日志中注意到,在某些时候,我将重新注册SqlDependency ,但是之后通知将永远不会触发。
看到这个行为之后,我决定运行SQL服务器上的分析器来捕获订阅事件。 从捕获的数据中,我注意到有时订阅将被一个用户注册(具有唯一的ID),但是然后它将被另一个用户触发(具有相同的唯一ID)。 这通常发生在我上面提到的服务以及WPF应用程序的一个或多个用户。 (我已经在探查器结果中附加了问题的截图)
这是预期的行为? 是否可以为不同的用户发起通知? 这是否指向应用程序层中的问题? 任何帮助表示赞赏。
由于正在创build多个SqlDependency实例,因此我将检查重复订阅,如此处所述。 根据您的configuration,订阅可能被认为是重复的。 该行为“意味着如果为相同查询请求通知,则只发送一个通知。”
另一件要检查的事情是OnChange事件是否可以实际工作,但不会出现,因为它在不同的线程上触发。 这里logging了SqlDependency的multithreading性质。
Profiler跟踪表明Service Broker正在完成其工作。 在.NET层中添加其他跟踪将显示订阅是否在数据库级别触发,但不会导致OnChange事件触发。 其他疑难解答提示可以在这里find。
- .NET中高级.NET 4.0和.NET 4.5之间的区别
- 升级到.NET 4.5后MSBuild部署失败
- 是否有可能等待一个事件,而不是另一个asynchronous方法?
- Microsoft.Bcl.Build NuGet包是做什么的?
- 并行运行两个asynchronous任务,并在.NET 4.5中收集结果
- 通过Visual Studio 2010定位.NET Framework 4.5
- 在.NET 4.0中创build一个可以与.NET 4.5中的“await”一起使用的asynchronous方法
- 在C#5中,foreach是否使用了variables?
- 为什么通用ICollection在.NET 4.5中实现IReadOnlyCollection?