我有一个大问题。当我在 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”中......
有人可以帮助我吗,也许可以解释一下为什么这行不通?
非常感谢!最好的问候托马斯