我希望这是我犯的一个愚蠢的错误。
不幸的是(或者幸运的是?)您犯了几个错误。
首先,您需要了解查询通知将使 一个查询 无效。因此,您最多只会收到 一次 通知,如果您想接收更多通知,则必须重新订阅(重新提交查询)。
接下来,您需要了解,由于 任何 原因,您不仅会收到更改通知,还会收到通知。在回调中,您 必须 检查通过传入的通知原因
SqlNotificationEventArgs
。接下来,您需要了解异步编程的基本原理:如果订阅事件,请确保在事件第一次发生 之前* 就进行订阅。恰当的例子: 您提交查询后,便会立即
On_SqlBitChanged
触发。这 应该 在构造函数中发生,但是您可以 在 构造函数运行 后 订阅。在挂接事件回调之前,可以在构造函数完成之间调用它,在这种情况下,该通知将被静默忽略。 *SqlWatcher.SqlWatcher``sqlWatcher.NewMessage
On_SqlBitChanged``NewMessage
如果要使用服务,请确保 在 使用 前 将其启动。您在中使用SqlDependency,
SqlWatcher.SqlWatcher
但 随后 在调用时启动它SqlWatcher.Start()
。最后,如果您希望收到有关查询更改的通知, 则必须提交查询 。您正在构造
SqlCommand
对象,设置通知,然后…丢弃对象。除非您实际提交查询,否则您还没有预订 任何东西 。
修复建议:
- Make
Start
和Stop
statics,调用Start
应用程序启动。 NewMessage
在 提交查询 之前, 请确保已订阅- 实际提交查询(致电
SqlComamnd.ExecuteQuery()
) - 检查
Info
,Type
然后Source
在On_SqlBitChanged
回调中,如果您的提交包含错误,则这是学习的唯一方法(即使通知请求无效,SqlComamnd.ExecuteQuery()也会成功) - 收到更改通知后,您必须重新订阅,然后再次执行查询。
还有一件事:不要在后台回调中调用UI代码。您不能
MessageBox.Show("MessageReceived");从回调中调用,必须通过路由通过表单主线程Form.Invoke。是的,我知道严格来说,
MessageBox.Show它确实 适用于非UI线程,但是您很快就会离开警报框而真正形成交互作用,然后一切都会中断。



