如何在类中使用SqlDependency?

时间:2011-03-15 16:40:32

标签: asp.net multithreading sqldependency

我有一个大问题。当我在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(在libary http://nitoasync.codeplex.com中借助GenericSynchronizingObject)。我调试,看到代码必须在第一次调用它,但它也挂起在“SqlDependency.Stop”......

有人能够帮助我,也许可以解释一下为什么这不起作用?

非常感谢! 最好的祝福 托马斯

1 个答案:

答案 0 :(得分: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();
  }
}