【问题标题】:How can I use SqlDependency in a class?如何在类中使用 SqlDependency?
【发布时间】:2011-03-15 16:40:32
【问题描述】:

我有一个大问题。当我在 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”中......

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

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

【问题讨论】:

    标签: asp.net multithreading sqldependency


    【解决方案1】:

    是的,我自己发现了 :) 如果有人遇到同样的问题:我使用自己的线程解决了它,当它必须重新启动 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();
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-20
      • 1970-01-01
      • 1970-01-01
      • 2015-11-05
      • 2019-05-02
      相关资源
      最近更新 更多