У меня большая проблема. Когда я реализую наблюдатель SqlDependency в форме окна, все работает нормально, пока я вызываю свое событие "OnChance" в потоке пользовательского интерфейса.
private void dependency_OnChange(object sender, SqlNotificationEventArgs e)
{
if (this.InvokeRequired)
{
OnChangeEventHandler tempDelegate = new OnChangeEventHandler(dependency_OnChange); object[] args = { sender, e };
this.Invoke(tempDelegate, args);
return;
}
SqlDependency dependency = (SqlDependency)sender;
dependency.OnChange -= dependency_OnChange;
SetSqlWatcher();
}
Если я перенесу свои методы в класс, я не смогу выполнять Invoke и InvokeRequired, потому что мой класс не реализует ISynchronizeInvoke. Если я прокомментирую эти строки, программа зависнет в первой строке SetSqlWatcher:
SqlDependency.Stop("Data Source=[....]");
То же самое происходит, когда я комментирую эти строки в форме окна, поэтому я думаю, что событие _OnChance находится в другом потоке, чем "поток", который я использую при первом вызове SetSqlWatcher.
Я также пытался реализовать ISynchronizeInvoke (с помощью GenericSynchronizingObject в libary http://nitoasync.codeplex.com). Я отладил, увидел, что код должен вызывать его в первый раз, но он также зависает в «SqlDependency.Stop». ..
Кто-то может мне помочь, и, возможно, объяснить мне, почему это не может работать?
Большое спасибо!
С наилучшими пожеланиями
Томас