2

我有一个大问题。当我在 Windows 窗体中实现 SqlDependency 观察程序时,只要我将“OnChance”事件调用到 ui 线程,一切都会正常工作。

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=[....]");

当我在 windowsform 中注释这些行时也会发生同样的情况,因此我认为 _OnChance 事件与我第一次调用 SetSqlWatcher 时使用的“线程”位于不同的线程上。

我还尝试实现 ISynchronizeInvoke(在库http://nitoasync.codeplex.com中的 GenericSynchronizingObject 的帮助下)。我调试,看到,代码必须第一次调用它,但它也挂在“SqlDependency.Stop”中......

有人可以帮助我吗,也许可以解释一下为什么这行不通?

非常感谢!最好的问候托马斯

4

1 回答 1

2

是的,我自己发现了 :) 如果有人遇到同样的问题:我使用自己的线程解决了它,当它必须重新启动 SqlDependency 时,使用 AutoResetEvent “通知”:

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();
  }
}
于 2011-03-16T12:51:23.920 回答