My SqlDependency works fine, and the Broker Queue and Service get dropped properly when the application exits (I do execute SqlDependency.Stop(...) as recommen
If you don't mind being a little cheezy, I've found a way to clean these up on exit...
First, set a flag that the onDependencyChange can observe to let it know to not re-subscribe to the query.
Second, set the flag and execute a do-nothing update that you know will trigger the dependency subscription.
update foo_master set foo_bar = foo_bar where foo_id = @id;
My dependency monitoring is done on individual rows, so I only have to tickle one row to get it to fire. It might not be something you'd want to do on a large result set.
On my FormClosing event, I fire each of the dependencies before disconnecting.
Partial code:
Private _dependency As SqlDependency = Nothing
Private _beingKilled = False
' dependency is set up in loadRecord(ByVal idRow as Integer)
Private Sub onDependencyChange(ByVal sender As Object, ByVal e As SqlNotificationEventArgs)
' This event may occur on a thread pool thread; It is illegal to update the UI from a worker thread.
' The following code checks to see if it is safe update the UI.
Dim iSync As ISynchronizeInvoke = CType(_connection.masterForm, ISynchronizeInvoke)
' If InvokeRequired returns True, the code is executing on a worker thread.
If iSync.InvokeRequired Then
Dim tempDelegate As New OnChangeEventHandler(AddressOf onDependencyChange) ' Create a delegate to perform the thread switch
Dim args() As Object = {sender, e}
iSync.BeginInvoke(tempDelegate, args) ' Marshal the data from the worker thread to the UI thread.
Else
RemoveHandler _dependency.OnChange, AddressOf onDependencyChange
If Not _beingKilled Then loadRecord(_id)
End If
End Sub
Then simply set _beingKilled to True and execute the do-nothing update.