Как я могу использовать SqlDependency в классе? - PullRequest
2 голосов
/ 15 марта 2011

У меня большая проблема. Когда я реализую наблюдатель 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». ..

Кто-то может мне помочь, и, возможно, объяснить мне, почему это не может работать?

Большое спасибо! С наилучшими пожеланиями Томас

1 Ответ

2 голосов
/ 16 марта 2011

Да, я узнал это сам :) Если кто-то столкнется с той же проблемой: я решил ее, используя собственный поток, который «информируется» с AutoResetEvent, когда он должен повторно инициировать SqlDependency:

private void dependency_OnChange(object sender, SqlNotificationEventArgs e)
{
  SqlDependency dependency = (SqlDependency)sender;
  dependency.OnChange -= dependency_OnChange;
  autoEvent.Set();
}

public void ThreadWorker(object data)
{
  while (true)
  {
    SetSqlWatcher();

    autoEvent.WaitOne();
  }
}
...